2014-10-17 57 views
1

我不知道这是否是一个错误或我做错了什么:每的Perl DBI/MySQL的Unicode的错误

open my $fh, "<:encoding(iso-latin1)", $file or die "Failed to open $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 

所以对我来说一切都应该罚款:

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

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

我是否错过了这可能是DBI/DBD :: mysql中的一个错误?

回答

1

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

  • 数据在输入文件存储为Latin-1的字节
  • 数据从输入文件,并自动转换为由于编码选项的Perl的人物在你open声明
  • 数据发送到MySQL和Perl字符读
  • 的MySQL通过获取UTF8而不是Latin-1的轻微混乱,但卖场也无妨最佳它可以

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

当然,如果您的数据全部为Latin-1,那么您可以考虑忽略任何解码/编码问题。它应该都是没有这种复杂性的工作。

+0

我知道编码可能会解决这个问题,但不应该perl处理这个自动?我的意思是这里没有歧义:Perl知道数据库需要iso拉丁字节而不是utf8字符。 – tim 2014-10-19 10:31:46

+0

你为什么认为Perl知道? – 2014-10-19 15:51:40