首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBD::Firebird编码/解码

DBD::Firebird编码/解码
EN

Stack Overflow用户
提问于 2022-06-14 13:48:08
回答 1查看 96关注 0票数 2

在本例中,Firebird返回未解码的字符串。我是否没有正确地设置数据库,或者这就是Firebird的工作方式?

代码语言:javascript
复制
#!/usr/bin/env perl
use warnings;
use 5.10.0;
use utf8;
use open qw( :std :utf8 );
use Devel::Peek;
use DBI;

my ( $db, $dbh, $sth, @array );
my $table = 'test_encoding';
my $create = "CREATE TABLE $table ( name varchar(32) )";
my $insert = "INSERT INTO $table ( name ) VALUES ( ? )";
my $select = "SELECT * FROM $table";
my $value = 'ä';

$db = '/home/me/my_firebird_db';
$dbh = DBI->connect(
    "dbi:Firebird:db=$db", 'user', 'password',
    { PrintError => 0, RaiseError => 1, ib_charset => 'UTF-8' }
);
$sth = $dbh->do( "DROP TABLE $table" );
$sth = $dbh->do( $create );;
$sth = $dbh->prepare( $insert );
$sth->execute( $value );
@array = $dbh->selectrow_array( $select );
Dump $array[0];
say $array[0];
say "";

$db = '/home/me/my_sqlite_db';
$dbh = DBI->connect(
    "dbi:SQLite:db=$db", '', '',
    { PrintError => 0, RaiseError => 1, sqlite_string_mode => 5 }
);
$sth = $dbh->do( "DROP TABLE IF EXISTS $table" );
$sth = $dbh->do( $create );
$sth = $dbh->prepare( $insert );
$sth->execute( $value );
@array = $dbh->selectrow_array( $select );
Dump $array[0];
say $array[0];

输出:

代码语言:javascript
复制
SV = PV(0x2105360) at 0x22628a0
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x22a37e0 "\303\244"\0
  CUR = 2
  LEN = 10
ä

SV = PV(0x2111470) at 0x2121220
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  PV = 0x1f2fed0 "\303\244"\0 [UTF8 "\x{e4}"]
  CUR = 2
  LEN = 10
ä
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-14 17:51:34

正如夹子在注释中提供的指向夹子的链接所示,您需要使用以下方法进行连接:

代码语言:javascript
复制
$dbh = DBI->connect(
    "dbi:Firebird:db=$db;ib_charset=UTF8", 'user', 'password',
    { PrintError => 0, RaiseError => 1, ib_enable_utf8 => 1 }

也就是说,ib_charset属性必须位于连接字符串中,而不是散列中,而且它的值必须是UTF8 (不是UTF-8!),您需要向哈希中添加设置1ib_enable_utf8

具体来说,这部分

ib_enable_utf8 (特定驱动程序,布尔型) 将此属性设置为TRUE将导致任何作为语句参数提供的Perl Unicode字符串在传递给Firebird之前被降级为八位序列。 此外,从数据库中检索到的任何字符数据(CHAR、VARCHAR、BLOB sub_type文本)都将升级到Perl Unicode字符串。 警告:目前只有在ib_charset DSN参数为UTF8时才支持。将来,可以实现任意字符集的编码和解码。 示例: 'dbi:Firebird:db=database.fdb;ib_charset=UTF8',{ ib_enable_utf8 => 1};

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72618139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档