2014-12-23 3 views
1

Я смущен о настройках Perl DBI для работы с utf8:шаги для сохранения и retriving utf8 в MySQL с Perl

$db->{mysql_enable_utf8} = 1 
$db->do(qq{SET NAMES utf8}); 

Я читал и должен выдавать их сразу после создания подключения к БД так:

my $db = DBI->connect($cstring, $user, $password); 
$db->{mysql_enable_utf8} = 1 
$db->do(qq{SET NAMES utf8}); 

Вот вопрос:

1) -Есть веб-страница с формой, которая установлена ​​в utf8, поэтому пользовательские данные отправляются в utf8 сценарию.

2) -цена использует CGI :: Простой для чтения данных формы. Должен ли я декодировать данные формы с помощью utf8::decode() или просто оставить его ?.

3) Должна ли я установить эти два или нет:

$db->{mysql_enable_utf8} = 1 
$db->do(qq{SET NAMES utf8}); 

Я надеюсь, что кто-то объяснит шаги, чтобы сохранять и читать utf8, начиная от получения пользовательского ввода на веб-странице в базе данных MySQL.

ответ

2

Я сделал некоторые тесты, которые могут быть полезны при ответе на часть вопроса.

Рассмотрим эту переменную в utf8 арабский:

my $string = "السلام عليكم"; 

Согласно этому uft8 счетчика:

https://mothereff.in/byte-counter

составляет 12 символов, в общей сложности 23 байт.

Эти два заявления

$strlen = length(($string)); 
say $strlen; 

$strlen = length(decode_utf8($string)); 
say $strlen; 

Печать 12, так что Perl знает, что это UTF-8 символов, потому что я использовал use utf8; сказать perl мой исходный код кодируется с использованием UTF-8. Это эквивалентно расшифровке ваших входов CGI.

Теперь к Mysql:

1) - Я создал тестовую таблицу с атрибутами:

ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci 

2) - Установка этих двух следующим после подключения к БД MySQL:

$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('SET NAMES utf8'); 

Когда я вижу таблицу в MySQL Windows Query Browser, я вижу, что она хранится как правильный арабский и всего 23 байта, и я могу читать текст как.

السلام عليكم 

3) - Без установки этих двух:

$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('SET NAMES utf8'); 

Когда я вижу таблицу в MySQL Query Browser для Windows я вижу неправильно закодированные данные в общей сложности 50 байт.

السلام عليكم 

Я использую Perl 5.10 для Windows.

Это означает, что мы должны установить эти два параметра для правильного хранения и извлечения из utf8 данных с MySQL сразу же после того подключения:

$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('SET NAMES utf8'); 

Это я думаю, очищает часть вопроса в хранении и извлечении данных из MySQL , остальная часть вопроса об обработке данных, начиная с приема данных из форм, должна быть сначала декодирована или просто использована как есть.

Mysql Query Browser Outputs