UTF8 кодиране на знаци в Perl DBI, MySQL със знаци ő и ű

Използвам унгарски език с хубави знаци ő и ű в моя perl скрипт с DBI и MySQL. Цялото кодиране на базата данни е UTF8 и аз използвам utf8 навсякъде. Таблицата е в кодиране utf8_general_ci и редовете са твърде utf8_general_ci.

Опитах се да променя кодирането на таблицата и редовете на 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? Или


person netdjw    schedule 10.01.2015    source източник
comment
Стартирайте SET NAMES UTF8 преди вмъкване   -  person Mihai    schedule 10.01.2015
comment
Според документацията това трябва да се направи от mysql_enable_utf8, но аз не съм експерт по DBI.   -  person Trent Lloyd    schedule 10.01.2015


Отговори (2)


Премахнете реда mysql_enable_utf8 и вашият скрипт работи за мен. Също така не забравяйте винаги да използвате strict и warnings.

#!/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;
person AKHolland    schedule 10.01.2015

Първото нещо, което трябва да направите, е да определите какво се проваля. Вие отпечатвате знаци, които сте извлекли от базата данни, след като сте ги съхранили в базата данни, след като сте ги прочели от източниците на 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
    
person ikegami    schedule 10.01.2015