首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库:列编码,什么时候重要?

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

Stack Overflow用户
提问于 2012-04-11 14:42:08
回答 1查看 787关注 0票数 2

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

mysql ... database_name < script.sql

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

我们解决这个问题的第一次尝试是将mysql列编码更改为UTF-8 (例如,如这里所描述的):

代码语言:javascript
复制
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代码片段)?我还是不明白。

希望有人帮我把事情弄清楚..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-24 12:00:49

在我看来,最大的原因是它破坏了您的DB一致性。

  • 通常情况下,您需要检查数据库中的数据。如果您不能正确地将UTF-8字符串从网页输入到您的MySQL CLI客户端,这是一个遗憾;
  • 如果您需要使用phpMyAdmin通过“正确”的web管理您的数据库,那么您就限制了自己(可能不是问题);
  • 如果你需要在你的数据上建立一个报告,那么你很大程度上受到可能的选择数量的限制,因为只有网络才能产生正确的输出;
  • 如果您需要向您的合作伙伴或外部公司提供部分数据库提取以进行分析,而提取结果就会被搞砸--这是很遗憾的。

现在请回答你们的问题:

  1. 当要求数据库对字符串数据类型的某些列进行ORDER BY时,排序规则将考虑到列的编码,因为某些内部转换适用于不同列的不同编码。如果您试图比较字符串,那么编码信息在这里也是必不可少的。编码是与排序规则结合在一起的,尽管大多数人并不经常使用这个特性。
  2. 如前所述,如果在不同编码中有任何列集,数据库将选择隐式地将值转换为公共编码,即现在的UTF8。字符串的隐式编码可以在客户机框架/库中执行,这取决于客户机的环境编码。通常,数据在发送到服务器时被重新编码到数据库的编码中,在交付结果时被重新编码到客户端的编码中。
  3. 二进制数据没有编码的概念,它只是一组字节。因此,当您转换为二进制时,您告诉数据库“忘记”编码,尽管您保存的数据没有任何更改。稍后,您将转换为执行正确编码的字符串。如果您确信数据物理上位于UTF-8中,则此技巧会有所帮助,而在某些情况下,指定了不同的编码。

考虑到您已经通过--default-character-set=utf8成功地将数据加载到数据库中,那么您的环境就有了一些问题,我建议它不是UTF8设置。

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

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

这样,错误的字段就会少一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10108263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档