繁体   English   中英

Perl 和 MySql 中的 utf8 编码

[英]utf8 encoding in Perl and MySql

我的数据库(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');

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

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

您需要在连接上设置mysql_enable_utf8

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

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

charset = utf8

这是完整的规范:

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

此外,打开此标志告诉 MySQL 应将传入数据视为 UTF-8。 这仅在用作 connect() 调用的一部分时才会生效。 如果在连接后打开该标志,则需要发出命令 SET NAMES utf8 以获得相同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM