我使用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 );
回读数据时无需解码。
答案 0 :(得分:4)
在Perl代码中,您需要确保Encode :: decode()输入,以便您的数据以perl的内部字符表示形式,处理数据,然后在写入数据库之前输入Encode :: encode()输出。你可能也想做:
$dbh->do('SET NAMES "utf8"');
连接到数据库后,MySQL客户端库和服务器就字符集达成一致。
请参阅:http://perldoc.perl.org/perlunitut.html和http://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也是如此;我对这种语言一无所知,所以我不能给你任何细节。