在Perl和MySql中使用utf8

dot*_*cks 13 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');
Run Code Online (Sandbox Code Playgroud)

任何帮助都是适合的!

谢谢.

Dav*_*man 8

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

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


w.k*_*w.k 7

您需要设置mysql_enable_utf8连接:

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

  • @dotnetrocks:它解决了您在问题中提出的问题。如果您在网页编码方面遇到问题,您应该注意 IO 和正确的标头 (2认同)