簡體   English   中英

使用 utf8 從 perl 腳本訪問 latin1 mysql 數據庫

[英]Accessing latin1 mysql database from perl script using utf8

我有一個使用utf8 pragma 的 perl 腳本,由於各種原因,它在 utf8 中執行大部分操作是最實用的。 但是,我需要訪問 mysql 數據庫,其中所有表都在 latin1 中。 我該怎么做?

一點“偽代碼”:

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 中,這可以按預期工作。

(我從不需要 INSERT 到表中,只需從中讀取,但我認為這並不重要。)

當連接到 mysql 時,你應該告訴你的腳本期望並提供 UTF-8,所以你需要在連接時告訴它:

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

AFAIK 最好在連接時告訴它,而不是之后。

嘗試將其設置為這樣的:

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

請注意,如果您的 Perl 源文件以 UTF-8 編碼,則utf8 pragma 僅適用。 另一方面,如果它以 Latin1 編碼,則不應使用utf8 pragma。 那么rødgrød是由七個(Latin1)還是九個(UTF-8)八位字節組成?

與 MySQL 的交互與utf8設置無關,soulSurfer2010 已針對該問題給出了正確答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM