【问题标题】:utf8 encoding in Perl and MySqlPerl 和 MySql 中的 utf8 编码
【发布时间】:2012-10-20 18:17:40
【问题描述】:

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

【问题讨论】:

  • “访问该数据时出现问题”不足以描述问题。
  • 我的意思是,访问数据时存在一些编码问题。我也更新了我的问题。
  • 如何准确地显示字符?你的网页是什么编码的?
  • 我在我的网页中使用 utf8。 "use encoding qw(utf8); use open qw(:std); use Encode qw/is_utf8 decode/; "并且字符呈现为"������?"
  • 那么您确实从数据库中获取了错误格式的数据(可能是 ISO-8859-1)

标签: mysql perl utf-8


【解决方案1】:

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

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

【讨论】:

  • 我编码了两次。我删除它并现在工作!多谢 !! :)
【解决方案2】:

您需要在连接时设置mysql_enable_utf8:

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

【讨论】:

  • 嗨,谢谢。我试过 mysql_enable_utf8 => 1 但问题没有解决。
  • @dotnetrocks:它解决了您在问题中提出的问题。如果您在网页编码方面遇到问题,则应注意 IO 和正确的标头
【解决方案3】:

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

charset = utf8

【讨论】:

    【解决方案4】:

    这是完整的规范:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2011-12-10
      • 2012-07-26
      • 2016-05-31
      相关资源
      最近更新 更多