2015-01-10 41 views
2

我在我的perl脚本与DBIMySQL使用匈牙利语言与好的ő和ű字符。所有的数据库编码都是UTF8,而且我在任何地方都使用utf8。该表采用utf8_general_ci编码,行也是utf8_general_ci。UTF8字符编码在Perl DBI,MySQL与ő和ű字符

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

+1

运行'SET NAMES UTF8'插入 – Mihai

+2

根据本应该由mysql_enable_utf8完成的文件之前,但我在DBI不是专家。 –

回答

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