Perl DBI 中的 UTF8 字符编码,MySQL 带有 ő 和 ű 字符
UTF8 character encoding in Perl DBI, MySQL with ő and ű characters
我在 perl
脚本中使用带有 DBI
和 MySQL
的匈牙利语和漂亮的 ő 和 ű 字符。所有的数据库编码都是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
行,您的脚本对我有用。还要记住始终使用 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;
您应该做的第一件事是确定失败的原因。在从 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
我在 perl
脚本中使用带有 DBI
和 MySQL
的匈牙利语和漂亮的 ő 和 ű 字符。所有的数据库编码都是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
行,您的脚本对我有用。还要记住始终使用 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;
您应该做的第一件事是确定失败的原因。在从 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