15

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

4 回答 4

9

您需要设置mysql_enable_utf8连接:

 my($dbh) = DBI->connect(
     'dbi:mysql:test',
     'user',
     'password',
     {
         mysql_enable_utf8 => 1,
     }      
);
于 2012-10-31T10:47:02.910 回答
9

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

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

于 2012-10-31T11:33:06.497 回答
0

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

charset = utf8
于 2012-10-31T10:30:02.087 回答
0

这是完整的规格:

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

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

于 2016-11-10T13:42:30.817 回答