2015-11-08 1 views
1

У меня есть XML-файл в кодировке UTF-8. Я использую Perl для анализа файла (используя модуль XML::Simple). Проанализированный код, который я хочу поместить в таблицу MySQL, также закодировал utf8 (точно utf8_generic_ci). Все хорошо, но два персонажа ошибаются (типично ő и ű с их прописными парами ŐŰ).Perl и MySQL UTF-8 искаженные символы после INSERT

Вот мой Perl код:

use strict; 
use warning; 
use utf8; 
use XML::Simple; 
use DBI; 

my $db = DBI->connect("dbi:mysql:dbname=$dbname;host=$host;port=$port", 
     $user, $passwd, {mysql_enable_utf8 => 1}) || die $DBI::errstr; 

my $ref = XMLin("file.xml"); 

for (my $i = 0; $i < scalar(@{$ref->{"PRODUCTS"}}); $i++) { 
    my $name = $ref->{"PRODUCTS"}[$i]->{"NAME"}; 
    # some changes on the $name, for example removing whitespaces, etc. 
    $db->do("INSERT INTO products (productname) VALUES ('".$name."');"); 
} 

А вот моя структура MySQL таблицы (SHOW CREATE TABLE products; выход):

| products | CREATE TABLE `products` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `productname` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Я думаю, что все в UTF-8. Если я вижу исходный XML-файл, есть хорошие символы. Но после вставки mysql они поступили не так. И другие акценты хороши.

Любая идея в чем проблема?

+0

Добавить это почти вверху: 'use open ': std', ': encoding (UTF-8)';' –

ответ

1

У вас есть опечатка в коде, он должен быть:

{ mysql_enable_utf8 => 1 } 

Кроме того, вы должны связать Params SQL:

$db->do("INSERT INTO products (productname) VALUES (?)", undef, $name); 

И, наконец, this SO question может, помогает вам

+0

Хотя вы обычно хотите, чтобы 'mysql_enable_utf8' включался при извлечении текстовых строк из базы данных, вам обычно не хотелось бы этого ena при извлечении XML-документа. Парсеры XML почти всегда ожидают байтов как входных, а не символьных строк. –

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