数据库:列编码,什么时候重要?

时间:2012-04-11 14:42:08

标签: mysql database character-encoding

我们正在将包含UTF-8编码数据的.sql脚本中的数据导入MySQL数据库:

mysql ... database_name < script.sql

稍后,这些数据将显示在我们的Web应用程序(连接到该数据库)的页面上,同样是UTF-8。但是在这个过程的某个地方出了问题,因为非ascii字符显示不正确。

我们首次尝试解决它是将mysql列编码更改为UTF-8(如示例here所述):

alter table wp_posts change post_content post_content LONGBLOB;`
alter table wp_posts change post_content post_content LONGTEXT CHARACTER SET utf8;

但它没有帮助。

最后,我们通过从.sql脚本导入带有附加命令行标志的数据解决了这个问题,因为我认为强制mysql客户端将.sql脚本中的数据视为UTF-8。

mysql ... --default-character-set=utf8 database_name < script.sql

它有所帮助,但后来我们意识到这次我们忘记将列编码更改为utf8 - 即使utf-8编码数据流经数据库(从sql脚本到应用程序),它也被设置为latin1

因此,即使数据库字符集设置不正确,如果从数据库中获取的数据也能正确显示,那么为什么我要设置正确的数据库编码?

特别是我想知道:

  1. 数据库的哪些部分依赖于列编码设置?当这个设置有任何实际意义吗?
  2. 在什么情况下完成列编码的隐式转换?
  3. 如何将列转换为二进制格式然后转换为目标编码工作(请参阅:上面的sql代码段)?我还是不明白。
  4. 希望有人帮我清理......

1 个答案:

答案 0 :(得分:1)

在我看来,最大的原因是它破坏了数据库的一致性。

  • 经常需要检查数据库中的数据。如果您无法正确地将来自网页的UTF-8字符串输入到您的MySQL CLI客户端,那真是太遗憾了;
  • 如果您需要使用phpMyAdmin通过“正确”的网络管理您的数据库,那么您就是限制自己(虽然可能不是问题);
  • 如果你需要建立一个关于你的数据的报告,那么你会受到可能选择的数量的极大限制,因为只有web产生了正确的输出;
  • 如果您需要将部分数据库摘录提供给您的合作伙伴或外部公司进行分析,并且提取已搞砸 - 很遗憾。

现在回答你的问题:

  1. 当您向数据库询问ORDER BY字符串数据类型的某些列时,排序规则会考虑列的编码,因为如果您对不同的列有不同的编码,则某些内部转换适用。如果您尝试比较字符串,则同样适用,编码信息在此处必不可少。虽然大多数人不经常使用此功能,但编码与整理相结合。

  2. 如上所述,如果您有不同编码的任何列集,数据库将选择隐式地将值转换为公共编码,现在是UTF8。字符串的隐式编码可能在客户端框架/库中完成,具体取决于客户端的环境编码。通常,数据在发送到服务器时会重新编码为数据库的编码,并在传递结果时返回到客户端的编码中。

  3. 二进制数据没有编码概念,它只是一组字节。因此,当您转换为二进制时,您告诉数据库“忘记”编码,尽管您保持数据没有更改。稍后,您将转换为强制执行正确编码的字符串。如果你确定数据物理是UTF-8,这个技巧会有所帮助,而有些事故是指定了不同的编码。

  4. 鉴于您已设法使用--default-character-set=utf8将数据加载到数据库中,那么与您的环境有关,我建议不是UTF8设置。

    我认为今天的最佳做法是:

    • 所有你的环境准备好UTF8,包括shell;
    • 所有您的数据库默认为UTF8编码。

    通过这种方式,您可以减少错误字段。