Почему китайские иероглифы отображаются неправильно в MySQL и Perl? - PullRequest
1 голос
/ 15 февраля 2011

Я использую Perl ORM Rose :: DB :: Object и сопоставление таблицы / столбца MySQL utf8_general_ci. Код для сохранения данных:

Motorcycle->new(
    type  => $self->param('type'),
    brand => $self->param('brand'),
    color => $self->param('color')
)->save;

Код для извлечения данных в Mojolicious (код эквивалентен utf8::decode):

<td><%= Mojo::ByteStream->new($cycle->type)->decode('utf-8') %></td>
<td><%= Mojo::ByteStream->new($cycle->brand)->decode('utf-8') %></td>
<td><%= Mojo::ByteStream->new($cycle->color)->decode('utf-8') %></td>

Китайские иероглифы прекрасно выглядят в моем приложении, но они кажутся странными в phpMyAdmin. Если я сохраню символы в phpMyAdmin, они будут в порядке в phpMyAdmin, но выглядят странно в моем приложении.

Я протестировал его в SQLite и с надстройкой Firefox SQLite, и символы хорошо выглядят как в надстройке Firefox SQLite, так и в моем приложении.

Я думаю, что это проблема с сервером. Если я объединю Perl с PHP, это может стать катастрофой.

Спасибо за помощь.


РАЗРЕШЕНО, как показано ниже:

__PACKAGE__->use_private_registry;
__PACKAGE__->default_connect_options( mysql_enable_utf8 => 1 );
__PACKAGE__->register_db(
driver   => 'mysql',
database => 'test',
host     => 'localhost',
username => 'root',
password => '',

Важно добавить эту строку в:

__PACKAGE__->default_connect_options( mysql_enable_utf8 => 1 );

При чтении данных декодирование не требуется.

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

В коде Perl вы должны быть уверены, что вы вводите Encode :: decode (), чтобы ваши данные находились во внутреннем символьном представлении perl, работали с вашими данными, а затем Encode :: encode () перед выводом в базу данных. Вы, вероятно, также захотите сделать:

$dbh->do('SET NAMES "utf8"');

после подключения к базе данных, чтобы клиентская библиотека MySQL и сервер согласовали набор символов.

см .: http://perldoc.perl.org/perlunitut.html и http://perldoc.perl.org/perlunicode.html

2 голосов
/ 15 февраля 2011

Не видя ваш код подключения MySQL, трудно быть уверенным, но, скорее всего, вам нужно сказать MySQL, что ваше подключение будет использовать UTF-8 - в противном случае оно интерпретирует ваши байты как некоторый другой набор символов, который будетобъясните, почему phpMyAdmin не показывает ожидаемый результат.

Для PHP с библиотекой mysql по умолчанию это то, для чего предназначен mysql_set_charset (при условии, что вы используете простой старый mysql_query);для mysqli у вас есть эквивалент mysqli_set_charset.

Если вы используете какую-то другую библиотеку для доступа к MySQL, вам придется поискать что-то похожее в ее документации.То же самое касается Perl;Я ничего не знаю об этом языке, поэтому не могу дать вам никаких подробностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...