为什么MySQL和Perl中的汉字显示异常?

时间:2011-02-15 00:27:38

标签: mysql perl utf-8 cjk

我使用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 个答案:

答案 0 :(得分:4)

在Perl代码中,您需要确保Encode :: decode()输入,以便您的数据以perl的内部字符表示形式,处理数据,然后在写入数据库之前输入Encode :: encode()输出。你可能也想做:

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

连接到数据库后,MySQL客户端库和服务器就字符集达成一致。

请参阅:http://perldoc.perl.org/perlunitut.htmlhttp://perldoc.perl.org/perlunicode.html

答案 1 :(得分:2)

没有看到你的MySQL连接代码,很难确定,但很可能,你需要告诉MySQL你的连接将使用UTF-8 - 否则,它会将你的字节解释为其他一些字符集,这会解释为什么phpMyAdmin没有向您显示预期的结果。

对于使用默认mysql库的PHP,这就是mysql_set_charset的用途(假设您使用的是普通的mysql_query);对于mysqli,你有相同的mysqli_set_charset。

如果您使用其他库来访问MySQL,则必须查看其文档中的类似内容。 perl也是如此;我对这种语言一无所知,所以我不能给你任何细节。