2014-10-17 3 views
1

Я не уверен, если это ошибка или я делаю что-то неправильно:Perl DBI/Mysql Unicode Bug

Я прочитал данные на

open my $fh, "<:encoding(iso-latin1)", $file or die "Failed to open $file: $!"; 

$ файл, безусловно, в изо-latin1.

Тогда у меня есть MySQL таблица, которая является

ENGINE=InnoDB AUTO_INCREMENT=53072 DEFAULT CHARSET=latin1 

проверить настройки подключения:

$dbh->prepare("show variables"); 

который дает

character_set_client, latin1 
character_set_connection, latin1 
character_set_database, latin1 
character_set_filesystem, binary 
character_set_results, latin1 
character_set_server, latin1 
character_set_system, utf8 

Так что для меня все должно быть прекрасно:

  • Таблица является изо-latin1
  • Данные изо-latin1 (должен быть Perl внутренний формат символов сейчас)
  • Информация подключения показывает правильные настройки
  • Вывод на STDOUT (терминал изо-latin1) правильно

Но: данные в таблице равны utf8 (скорее всего, внутренний формат perl в этом случае).

Я пропустил что-то, это может быть ошибка в DBI/DBD :: mysql?

ответ

1

Я предполагаю, что вы правы, и эти данные находятся во внутреннем формате символов Perl. Последовательность выглядит следующим образом.

  • данных во входном файле хранятся в виде Latin-1 байт
  • Данные считываются из входного файла и авто-преобразуются в символы Perl из-за опции кодирования на вашем open заявлении
  • данные, посланные в MySQL в качестве символов Perl
  • MySQL немного смущен, получив UTF8 вместо Latin-1, но сохраняет его в любом случае, как лучше всего это может

шаг ваши недостающее является кодированием вам Perl символов обратно в латинский -1 перед отправкой их в базу данных. Очевидным решением является вызов encode('iso-885901', $string) на каждое значение, отправленное в базу данных. Было бы неплохо, если бы была какая-то опция автоматического кодирования. Но я не могу найти его.

Конечно, если ваши данные все будут латинскими-1, то вы можете просто игнорировать любые проблемы декодирования/кодирования. Все это должно работать без этого осложнения.

+0

Я понимаю, что кодирование, вероятно, решит проблему, но не должно обрабатывать это автоматически. Я имею в виду, что здесь нет никакой двусмысленности: Perl знает, что база данных ожидает байты iso latin, а не utf8. – tim

+0

Почему вы думаете, что Perl это знает? –

Смежные вопросы