【问题标题】:Perl DBI/Mysql Unicode BugPerl DBI/Mysql Unicode 错误
【发布时间】:2014-12-12 23:18:33
【问题描述】:

我不确定这是错误还是我做错了什么:

我每次读取数据

open my $fh, "<:encoding(iso-latin1)", $file or die "Failed to open $file: $!";

$file 肯定是 iso-latin1。

然后我有一个mysql表

ENGINE=InnoDB AUTO_INCREMENT=53072 DEFAULT CHARSET=latin1

我检查连接设置:

$dbh->prepare("show variables");

这给了

character_set_client, latin1
character_set_connection, latin1
character_set_database, latin1
character_set_filesystem, binary
character_set_results, latin1
character_set_server, latin1
character_set_system, utf8

所以对我来说一切都应该没问题:

  • 表是 iso-latin1
  • 数据是 iso-latin1(现在应该是 perl 内部字符格式)
  • 连接信息显示正确的设置
  • 输出到 STDOUT(终端是 iso-latin1)是正确的

但是:表中的数据是纯 utf8(在这种情况下很可能是 perl 的内部格式)。

我错过了什么,这可能是 DBI/DBD::mysql 中的错误吗?

【问题讨论】:

    标签: mysql perl unicode


    【解决方案1】:

    我猜你是对的,而且这些数据是 Perl 的内部字符格式。顺序是这样的。

    • 输入文件中的数据存储为 Latin-1 字节
    • 由于open 语句中的编码选项,从输入文件读取数据并自动转换为 Perl 字符
    • 以 Perl 字符形式发送到 MySQL 的数据
    • MySQL 因使用 UTF8 而不是 Latin-1 有点困惑,但无论如何都会尽可能地存储它

    您缺少的步骤是在将 Perl 字符发送到数据库之前将它们编码回 Latin-1。显而易见的解决方案是对您发送到数据库的每个值调用encode('iso-885901', $string)。如果有某种自动编码选项会很好。但我找不到。

    当然,如果您的数据都是 Latin-1,那么您可以考虑忽略任何解码/编码问题。这一切都应该没有那么复杂。

    【讨论】:

    • 我知道编码可能会解决问题,但 perl 不应该自动处理这个问题吗?我的意思是这里没有歧义:Perl 知道数据库需要 iso latin 字节而不是 utf8 字符。
    • 为什么你认为 Perl 知道这一点?
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2012-10-01
    • 1970-01-01
    • 2013-02-01
    • 2020-02-26
    • 2011-03-26
    相关资源
    最近更新 更多