Perl DBI 中的 UTF8 字符编码,MySQL 带有 ő 和 ű 字符

UTF8 character encoding in Perl DBI, MySQL with ő and ű characters

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

我试图将 table 和行编码更改为 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 是否有特殊的参数或设置?或者

删除 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;

您应该做的第一件事是确定失败的原因。在从 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