我在perl
脚本DBI
和MySQL
中使用匈牙利语和优秀的和ű字符。所有数据库编码都是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有特殊参数或设置吗?或者
答案 0 :(得分:4)
你应该做的第一件事就是找出失败的原因。在从Perl源中读取后,将数据库中存储的字符存储在数据库中后,将打印这些字符。这可能是失败的四个可能步骤。
sprintf "U+%v04x", $sql
是否包含U+0151.0171.0150.0170
?如果是,则查询是您认为的。
使用脚本插入它们时,使用phpMyAdmin查看时数据是否正确显示?如果是这样,则正确插入字符。
sprintf "U+%v04x", $this[0]
是否会U+0151.0171.0150.0170
?如果是,则正确检索字符。
然后就是正确输出它们的问题。您没有告诉Perl如何对字符串进行编码以进行输出。
use open ':std', ':encoding(UTF8)'; # Most unix boxes
use open ':std', ':encoding(cp1252)'; # Most Windows boxes
答案 1 :(得分:1)
删除mysql_enable_utf8
行,您的脚本适合我。另请记住始终使用strict
和warnings
。
#!/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;