我们正在将包含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
。
因此,即使数据库字符集设置不正确,如果从数据库中获取的数据也能正确显示,那么为什么我要设置正确的数据库编码?
特别是我想知道:
希望有人帮我清理......
答案 0 :(得分:1)
在我看来,最大的原因是它破坏了数据库的一致性。
现在回答你的问题:
当您向数据库询问ORDER BY
字符串数据类型的某些列时,排序规则会考虑列的编码,因为如果您对不同的列有不同的编码,则某些内部转换适用。如果您尝试比较字符串,则同样适用,编码信息在此处必不可少。虽然大多数人不经常使用此功能,但编码与整理相结合。
如上所述,如果您有不同编码的任何列集,数据库将选择隐式地将值转换为公共编码,现在是UTF8。字符串的隐式编码可能在客户端框架/库中完成,具体取决于客户端的环境编码。通常,数据在发送到服务器时会重新编码为数据库的编码,并在传递结果时返回到客户端的编码中。
二进制数据没有编码概念,它只是一组字节。因此,当您转换为二进制时,您告诉数据库“忘记”编码,尽管您保持数据没有更改。稍后,您将转换为强制执行正确编码的字符串。如果你确定数据物理是UTF-8,这个技巧会有所帮助,而有些事故是指定了不同的编码。
鉴于您已设法使用--default-character-set=utf8
将数据加载到数据库中,那么与您的环境有关,我建议不是UTF8设置。
我认为今天的最佳做法是:
通过这种方式,您可以减少错误字段。