Perl和MySql中的utf8编码

时间:2012-10-31 10:03:02

标签: mysql perl utf-8

我的数据库(MySql)有一个utf8_general排序规则。我正在从数据库访问数据并显示一个网页(在Perl中开发),它显示了具有不同字符的瑞典字符(ä,å,ö)。我检查了Mysql数据库,在那里我可以看到带有ä,å,ö字符的数据。看来,访问数据时存在编码问题。在连接数据库时,使用以下代码

my($dbh) = DBI->connect($config{'dbDriver'},$config{'dbUser'},$config{'dbPass'}) or die "Kunde inte ansluta till $config{'dataSource'}: " . $DBI::errstr;
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('set names utf8');

任何帮助都是适用的!

感谢。

4 个答案:

答案 0 :(得分:8)

如果每个ä/å/ö在输出中以两个字节表示,那么您也可能对字符进行双重编码。 (鉴于问题已经显示你正在做$dbh->{'mysql_enable_utf8'} = 1;,我怀疑这是最可能的情况。)另一种可能性,假设你在网页上显示这个,是该页面可能没有指定charset在<head>中是UTF-8,浏览器可能会错误地猜测它使用的字符编码。

仔细查看您的webapp框架,模板系统等,以确保这些值仅在从数据库中检索到它们到达用户浏览器时之间进行一次编码。如果正确配置,许多框架/模板引擎(例如我通常使用的Dancer和TT的组合)将自动处理输出编码,这意味着如果数据在输出之前被显式编码,则将对其进行双重编码。 / p>

答案 1 :(得分:7)

您需要在连接上设置mysql_enable_utf8

 my($dbh) = DBI->connect(
     'dbi:mysql:test',
     'user',
     'password',
     {
         mysql_enable_utf8 => 1,
     }      
);

答案 2 :(得分:0)

您需要在连接中将Charset设置为utf8!

charset = utf8

答案 3 :(得分:0)

这是complet规范:

http://search.cpan.org/~capttofu/DBD-mysql-4.038/lib/DBD/mysql.pm#mysql_enable_utf8

  

此外,打开此标志会告诉MySQL应将传入数据视为UTF-8。只有在用作零件时才会生效   对connect()的调用。如果你在连接后打开旗帜,   你需要发出命令SET NAMES utf8才能得到相同的结果   效果。