【问题标题】:Why do Chinese characters display abnormal in MySQL and Perl?为什么MySQL和Perl中汉字显示异常?
【发布时间】:2011-06-27 07:09:44
【问题描述】:

我使用 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 );

读回数据时无需解码。

【问题讨论】:

  • 由于这些是编码+显示问题,请检查您的应用程序和 phpmyadmin 的 charset= mime 参数。确保在 Apache 配置、php.ini、您的应用程序和 phpmyadmin 中巩固默认值。还要检查
  • 我根据我认为最有可能出现的问题发布了一个答案。如果这不起作用,如果您提供一个文本看起来“奇怪”的具体示例会有所帮助。

标签: mysql perl utf-8 cjk


【解决方案1】:

在 Perl 代码中,您需要确保 Encode::decode() 输入以使您的数据采用 perl 的内部字符表示,处理您的数据,然后在写入数据库之前对您的输出进行 Encode::encode()。您可能还想这样做:

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

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

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

【讨论】:

  • 谢谢。我按照您的指示进行了一些网络搜索,设置了默认连接,它可以工作。详细贴在本帖回复中。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 2017-08-28
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2020-06-29
    • 2011-04-08
    相关资源
    最近更新 更多