【问题标题】:UTF8 character encoding in Perl DBI, MySQL with ő and ű charactersPerl DBI 中的 UTF8 字符编码,带有 ő 和 ű 字符的 MySQL
【发布时间】:2015-01-10 09:46:44
【问题描述】:

我在 perl 脚本中使用带有漂亮 ő 和 ű 字符的匈牙利语,带有 DBIMySQL。所有的数据库编码都是 UTF8,我到处使用 utf8。表是utf8_general_ci编码,行也是utf8_general_ci。

我试图将表和行编码更改为 utf8_hungarian_ci 和 utf8_unicode_ci。这无济于事。

当我使用 PHPMyAdmin 插入行时,似乎一切正常,当我在控制台中签入时也很好。只有当我尝试在 Perl DBI 连接中使用时,只有这种情况我才会看到“?”字符而不是 'ő'、'Ő'、'ű' 和 'Ű' 字符。

这是我的 perl 脚本:

use uft8;
use DBI

my $db = DBI->connect("dbi:mysql:dbname=...", "user", "passwd",
                      {mysql_enable_utf8 => 1}) || die $DBI::error;

$db->do("INSERT INTO mytable (name) VALUES ('őűŐŰ')");
my $dbh = $db->prepare("SELECT name FROM mytable;");
$dbh->execute;
while (my @this = $dbh->fetchrow_array) {
    print $this[0]."\n";
}

怎么了? DBI 是否有特殊的参数或设置?或者

【问题讨论】:

  • 插入前运行SET NAMES UTF8
  • 根据文档,这应该由 mysql_enable_utf8 完成,但我不是 DBI 专家。

标签: mysql perl encoding utf-8 dbi


【解决方案1】:

您应该做的第一件事是确定失败的原因。在从 Perl 源读取字符后,将它们存储在数据库中后,您正在打印从数据库中检索到的字符。这是可能失败的四个步骤。

  1. sprintf "U+%v04x", $sql 是否包含U+0151.0171.0150.0170?如果是这样,那么查询就是您认为的那样。

  2. 当您使用脚本插入它们时,使用 phpMyAdmin 查看时数据是否正确显示?如果是这样,则字符已正确插入。

  3. sprintf "U+%v04x", $this[0] 是否提供U+0151.0171.0150.0170?如果是,则正确检索字符。

  4. 然后就是正确输出它们的问题。你没有告诉 Perl 如何编码输出字符串。

    use open ':std', ':encoding(UTF8)';    # Most unix boxes
    use open ':std', ':encoding(cp1252)';  # Most Windows boxes
    

【讨论】:

    【解决方案2】:

    删除mysql_enable_utf8 行,您的脚本对我有效。还要记住始终使用strictwarnings

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use utf8;
    use DBI;
    
    my $dbh = DBI->connect(
        "dbi:mysql:dbname=$dbname;host=$host;port=$port;",
        $username,
        $pw,
    );
    $dbh->do("INSERT INTO mytable (name) VALUES ('őűŐŰ')");
    my $sth = $dbh->prepare("SELECT name FROM mytable");
    $sth->execute;
    while(my ($name) = $sth->fetchrow_array) {
        print "$name\n"; # őűŐŰ
    }
    exit;
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2012-10-20
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多