2015-01-10 12 views
2

DBIMySQLperl 스크립트에서 좋은 ő 및 ű 문자로 헝가리어를 사용하고 있습니다. 모든 데이터베이스 인코딩은 UTF8이며 어디에서나 utf8을 사용합니다. 테이블이 utf8_general_ci 인코딩이고 행이 너무 utf8_general_ci입니다.Perl DBI, MySQL의 ö 및 ¨ 문자로 된 UTF8 charater 인코딩

테이블 및 행 인코딩을 utf8_hungarian_ci 및 utf8_unicode_ci로 변경하려고 시도했습니다. 이것은 도움이되지 않습니다.

PHPMyAdmin을 사용하여 행을 삽입했을 때 모든 것이 괜찮은 것으로 보이고 콘솔에 체크인 할 때도 좋습니다. 오직 Perl DBI 연결에 사용하려고 할 때만이 경우에만 '?'이 표시됩니다. '' ','ű '및'Ű '문자 대신에'문자 '를 사용할 수 있습니다.

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

이 mysql_enable_utf8 수행해야합니다 문서에 따르면 – Mihai

+2

를 삽입하기 전에 실행'SET NAMES 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 소스에서 데이터베이스에 저장된 문자를 데이터베이스에 저장 한 후 인쇄합니다. 그것은 실패했을 수있는 4 가지 단계입니다.

  1. sprintf "U+%v04x", $sqlU+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