如何正确地将Unicode传递给Perl的DBI层?

天花板

我有以下用于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标志(如文档中所述),但我无法执行包含Unicode字符的查询:

$ ./sqlite.pl "select * from person where lastname = 'Schütte'"
$VAR1 = [];

当我掩盖'ü'时,似乎不确定,尽管我不确定,是\x{fc}Latin 1FC还是UnicodeU+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=
池上

您需要问自己的第一个问题是:

应该对查询进行编码(如果可以的话,采用哪种编码),还是应该对查询进行解码(即Unicode代码点)?

这应该基于sqlite_unicode,但不是。那只会影响返回的字符串。我怀疑DBD :: SQLite与大多数/所有DBD一样,都遭受Unicode错误的困扰,这意味着问题的答案是基于字符串存储方式的内部细节。

在UTF-8系统中,它通常“可以正常工作”,我很惊讶它不在这里。请试试

use Encode qw( decode_utf8 );

my $sql = decode_utf8(shift);

如果这样做不起作用,请提供以下输出(在将查询移出之前@ARGV):

use Devel::Peek qw( Dump );
Dump($ARGV[0]);

当我掩盖'ü'时,似乎不确定,尽管我不确定,是否\x{fc}表示Latin 1 FC或Unicode U+00FC

这个问题没有任何意义。在iso-latin-1和Unicode中,FC都是“ü”。我相信你实际上是在问

返回的字符串是使用iso-latin-1编码的还是解码的字符串(即Unicode代码点)?

使用sqlite_unicode,它们就是后者。您需要对输出进行编码。您可以按照以下方式进行操作:

use open ':std', ':encoding(UTF-8)';

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确地将参数传递给函数?[批]

来自分类Dev

如何正确地将“this”传递给函数?

来自分类Dev

如何正确地将完整文件名传递给`cmd / c`?

来自分类Dev

您如何正确地将字节对象传递给Python中的新线程?

来自分类Dev

如何正确地将数据传递给<input list>属性?

来自分类Dev

如何正确地将args数组传递给Java中的方法?

来自分类Dev

如何正确地将Win32类对象传递给函数

来自分类Dev

在React中,如何正确地将输入值从子级传递给父级

来自分类Dev

如何正确地将弱引用传递给函数的调用者?

来自分类Dev

如何从SwiftUI LazyVGrid正确地将“单元项”传递给.sheet?

来自分类Dev

如何将点击处理程序从父母正确地传递给孩子?

来自分类Dev

如何正确地将文件夹名称传递给Shell脚本?

来自分类Dev

如何正确地将参数传递给fixedthreadpool,并控制线程执行?

来自分类Dev

如何在Rails中正确地将参数传递给特定操作

来自分类Dev

如何正确地将值传递给Google Maps URL方案回调?

来自分类Dev

QML:如何从 C++ 代码正确地将属性传递给 PluginParameter 值?

来自分类Dev

未传递功能参数。如何正确地将参数传递给另一个JavaScript文件的功能?

来自分类Dev

如何正确地将表单数据传递给CodeIgniter中的数据库功能

来自分类Dev

如何正确地将值传递给Flutter中任何窗口小部件的事件处理函数?

来自分类Dev

如何正确地将texture2d_array <float>传递给片段着色器?

来自分类Dev

您如何正确地将视图中的post变量传递给CodeIgniter中的控制器?

来自分类Dev

正确地将Buffer对象传递给imagemagick库

来自分类Dev

如何正确地将自定义数据属性道具传递给子组件?

来自分类Dev

如何正确地将会话值传递给方法feed()

来自分类Dev

如何正确地引用作为地址传递给函数的char **指针?

来自分类Dev

如何正确地将被杀死的子进程的退出状态传递给 shell?

来自分类Dev

如何正确地将可变变量传递给带有伴随对象的 kotlin 类?

来自分类Dev

如何正确地将数据从服务传递到控制器

来自分类Dev

如何正确地将结构数组从MQL4传递到C#DLL库

Related 相关文章

  1. 1

    如何正确地将参数传递给函数?[批]

  2. 2

    如何正确地将“this”传递给函数?

  3. 3

    如何正确地将完整文件名传递给`cmd / c`?

  4. 4

    您如何正确地将字节对象传递给Python中的新线程?

  5. 5

    如何正确地将数据传递给<input list>属性?

  6. 6

    如何正确地将args数组传递给Java中的方法?

  7. 7

    如何正确地将Win32类对象传递给函数

  8. 8

    在React中,如何正确地将输入值从子级传递给父级

  9. 9

    如何正确地将弱引用传递给函数的调用者?

  10. 10

    如何从SwiftUI LazyVGrid正确地将“单元项”传递给.sheet?

  11. 11

    如何将点击处理程序从父母正确地传递给孩子?

  12. 12

    如何正确地将文件夹名称传递给Shell脚本?

  13. 13

    如何正确地将参数传递给fixedthreadpool,并控制线程执行?

  14. 14

    如何在Rails中正确地将参数传递给特定操作

  15. 15

    如何正确地将值传递给Google Maps URL方案回调?

  16. 16

    QML:如何从 C++ 代码正确地将属性传递给 PluginParameter 值?

  17. 17

    未传递功能参数。如何正确地将参数传递给另一个JavaScript文件的功能?

  18. 18

    如何正确地将表单数据传递给CodeIgniter中的数据库功能

  19. 19

    如何正确地将值传递给Flutter中任何窗口小部件的事件处理函数?

  20. 20

    如何正确地将texture2d_array <float>传递给片段着色器?

  21. 21

    您如何正确地将视图中的post变量传递给CodeIgniter中的控制器?

  22. 22

    正确地将Buffer对象传递给imagemagick库

  23. 23

    如何正确地将自定义数据属性道具传递给子组件?

  24. 24

    如何正确地将会话值传递给方法feed()

  25. 25

    如何正确地引用作为地址传递给函数的char **指针?

  26. 26

    如何正确地将被杀死的子进程的退出状态传递给 shell?

  27. 27

    如何正确地将可变变量传递给带有伴随对象的 kotlin 类?

  28. 28

    如何正确地将数据从服务传递到控制器

  29. 29

    如何正确地将结构数组从MQL4传递到C#DLL库

热门标签

归档