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

时间:2015-01-10 09:46:44

标签: mysql perl encoding utf-8 dbi

我在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有特殊参数或设置吗?或者

2 个答案:

答案 0 :(得分:4)

你应该做的第一件事就是找出失败的原因。在从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
    

答案 1 :(得分:1)

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