Кодировка символов UTF8 в Perl DBI, MySQL с символами ő и ű

Я использую венгерский язык с красивыми символами ő и ű в моем сценарии perl с DBI и MySQL. Вся кодировка базы данных UTF8, и я везде использую utf8. Таблица в кодировке utf8_general_ci, а строки тоже в utf8_general_ci.

Меня пытались изменить кодировку таблицы и строк на utf8_hungarian_ci и utf8_unicode_ci. Это не помощь.

Когда я вставлял строки с помощью PHPMyAdmin, и, кажется, все в порядке, и когда я проверяю в консоли, тоже хорошо. Только если я пытаюсь использовать в Perl DBI connect, только в этом случае я вижу '?' вместо символов «ő», «Ő», «ű» и «Ű».

Вот мой 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