【发布时间】:2016-01-20 15:40:23
【问题描述】:
我有以下用于 Sqlite 数据库的简单 Perl 包装器:
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
use Data::Dumper;
my $sql = shift;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=data.sqlite3",
"", # no user
"", # no pw
{
RaiseError => 1,
sqlite_unicode => 1
},
) || die $DBI::errstr;
my $sth = $dbh->prepare($sql);
$sth->execute();
print Dumper ($sth->fetchall_arrayref({}));
$sth->finish();
$dbh->disconnect();
虽然我设置了sqlite_unicode标志as explained in the documentation,但我无法执行包含Unicode字符的查询:
$ ./sqlite.pl "select * from person where lastname = 'Schütte'"
$VAR1 = [];
当我屏蔽 'ü' 时,它似乎可以工作,虽然我不确定 \x{fc} 是否意味着 Latin 1 FC or Unicode U+00FC。
$ ./sqlite.pl "select * from person where lastname like 'Sch%tte'"
$VAR1 = [
{
'id' => 8,
'firstname' => undef,
'lastname' => "Sch\x{fc}tte"
}
];
当我使用 Sqlite 命令行工具执行相同操作时,它可以正常工作:
$ sqlite3 data.sqlite3 "select * from person where lastname = 'Schütte'"
8||Schütte
我是否忘记告诉 DBI 层支持 Unicode 字符?
我的本地编码是 UTF-8:
$ locale
LANG=de_DE.utf8
LANGUAGE=
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE="de_DE.utf8"
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=
【问题讨论】: