2011-10-28 26 views
5

Perl/DBI kullanarak bir MySQL tablosuna utf-8 dizeleri yazmaya çalışıyorum. Bir sebepten dolayı dize ilk ascii olmayan karakterde kesiliyor. Örneğinutf-8 dize Perl/DBI kullanarak MySQL tablosunda kesiliyor

, aşağıdaki tabloyu kurarsanız:

CREATE DATABASE testdb DEFAULT CHARSET=utf8; 
CREATE TABLE testdb.testtable (textval CHAR(30)) DEFAULT CHARSET=utf8; 

Ve sonra aşağıdaki Perl kodu çalıştırın: Aslında "N" yazıyor

#!/usr/bin/perl 
use strict; 
use DBI; 
my $dbh = DBI->connect('DBI:mysql:host=localhost;database=testdb', 'testuser', 'somepassword', {mysql_enable_utf8 => 1}) or die $DBI::errstr; 
$dbh->do('SET NAMES utf8'); 
$dbh->do("INSERT INTO testtable (textval) VALUES ('the N\xFCrburgring')"); 

.

271 Query INSERT INTO testtable (textval) VALUES ('the Nürburgring') 

Yani dize bozulmamış sunucusunun DB ulaşıyor: MySQL sorgu günlüğüne Looking

(o "Nürburgring" yazılı gerekirken), bunu gördüm. Ben MySQL konsolunda doğrudan aynı sorguyu girerseniz

:

INSERT INTO testtable (textval) VALUES ('the Nürburgring'); 

tüm dizeyi doğru yazılır. Ne yaptığım hakkında bir fikrin var mı?

+0

Komut dosyanızda '\ xFC' -' ü' değiştirirseniz ne yazılır? – TLP

+0

Perl kodunda bir literal ü kullanırsam tam olarak aynı şeyi yapar. – plasticinsect

cevap

4

mysql_enable_utf8 özniteliğini ayarlarsınız, böylece arabirime bir Perl dizesi dizisi vereceğinize dair söz verdiniz. Ancak, bu Latin1 kodlaması içinde sekizli bir tamponudur.

use Devel::Peek qw(Dump); 
Dump "the N\xfcrburgring"; 
# FLAGS = (POK,READONLY,pPOK) 
# PV = 0x208e4f0 "the N\374rburgring"\0 

Düzeltme basittir. Ya ... kaynak kodu UTF-8 olduğunu Perl anlatmak ve editörü ile UTF-8 kodlamasında kaynağını kaydetmek için utf8 pragma kullanın \x kaçar olmadan normal karakterlerle notate

use utf8; 
use Devel::Peek qw(Dump); 
Dump "the Nürburgring"; 
# FLAGS = (POK,READONLY,pPOK,UTF8) 
# PV = 0x20999f0 "the N\303\274rburgring"\0 [UTF8 "the N\x{fc}rburgring"] 

... ya içine sekizli çözmek dizi. Çoğu zaman edebi olmayanlarla uğraşıyorsunuz, ancak dışarıdan gelen verilerle, learn about the whole topic of encoding.

use Encode qw(decode); 
use Devel::Peek qw(Dump); 
Dump decode 'Latin1', "the N\xfcrburgring"; 
# FLAGS = (TEMP,POK,pPOK,UTF8) 
# PV = 0x208f6b0 "the N\303\274rburgring"\0 [UTF8 "the N\x{fc}rburgring"] 
+0

Açıklama için teşekkür ederiz. Sanırım şimdi anladım. Ekleme satırını $ dbh-> do (gumunu (decode ('Latin1', 'INSERT INTO testtable (textval) VALUES (' N \ xFCrburgring '))) değiştirdi ve şimdi mükemmel çalışıyor. – plasticinsect