2011-04-30 72 views
2

我有一个使用utf8编译指示的perl脚本,出于各种原因,它在utf8中完成大部分操作是最实际的。但是,我需要访问一个mysql数据库,其中所有表都是latin1。我应该怎么做?使用utf8从perl脚本访问latin1 mysql数据库

“伪”的位:

use utf8; 
use DBI; 

my $dbh = DBI->connect("DBI:mysql:$database;host=$server", $user, $pw); 
my $sth = $dbh->prepare(
    "SELECT recipe.ingredients 
    FROM recipe 
    WHERE recipe.id=?"); 

$sth->execute('rødgrød'); 

如果我把use utf8;并保存在我的latin1脚本,这按预期工作。

(我从来不需要插入到表,从它刚读,但我不认为这真的很重要)

回答

3

当连接到MySQL,你应该告诉你的脚本需要,并提供UTF-8,所以你需要告诉它连接:

my $dbh = DBI->connect("DBI:mysql:$database;host=$server", $user, $pw, {mysql_enable_utf8 => 1 }); 

据我所知这是更好地告诉它的连接,而不是事后。

+0

谢谢!它的工作原理,但我有点困惑,为什么会这样。 'perldoc DBD :: mysql'表示'这个属性确定DBD :: mysql是否应该假设存储在数据库中的字符串是utf8。'但事实并非如此。另外,我应该担心这个提示'这个选项是试验性的,可能会在未来版本中改变。'? – Villemoes 2011-04-30 18:10:37

+0

关于做实验:已经很多年了,太多的代码依赖于它。现在没有更好的方法。关于其他一点:似乎这个变量(mysql_enable_utf8)仍然告诉驱动程序必要时将字符串解码为UTF-8。没有在代码中找到它,因为驱动程序部分是二进制的。 – 2011-04-30 19:07:28

1

尝试这样设置的东西:

$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do(qq{SET NAMES 'utf8';}); 
0

utf8编译指示是由Perl编写的UTF-8编码。另一方面,如果它以Latin1编码,则应该使用utf8编译指示而不是。那么rødgrød由七个(Latin1)还是九个(UTF-8)八位字节组成?

与MySQL的交互独立于utf8设置,并且soulSurfer2010针对该问题给出了正确答案。

+0

我的脚本是utf-8。我的意思是“如果我把所有东西都切掉,除了上面的小块,并保存为latin1,它就可以工作”。这主要是为了说服自己,问题在于编码,而不是别的。 – Villemoes 2011-04-30 18:00:30