【发布时间】:2019-07-02 08:37:55
【问题描述】:
在我的 codeigniter 项目中,我使用 MySQL 作为数据库。它的排序规则是'latin1_swedish_ci'。现在我需要扩展我的网站以存储“波兰语”、“德语”、“法语”、“乌克兰语”、“荷兰语”以及“英语”。但我不知道要使用哪种排序规则。我在网络上找到了不同语言的不同答案。但我需要一个通用的。请帮我找出解决办法。
【问题讨论】:
在我的 codeigniter 项目中,我使用 MySQL 作为数据库。它的排序规则是'latin1_swedish_ci'。现在我需要扩展我的网站以存储“波兰语”、“德语”、“法语”、“乌克兰语”、“荷兰语”以及“英语”。但我不知道要使用哪种排序规则。我在网络上找到了不同语言的不同答案。但我需要一个通用的。请帮我找出解决办法。
【问题讨论】:
在关心collation之前,你需要先迁移到一个兼容Unicode的encoding。顾名思义,Latin-1* 是为拉丁文字设计的,不能编码所有波兰字符,当然也不能编码西里尔文字。 2019 年显而易见的选择是 UTF-8,对应于 MySQL 术语中的utf8mb4。
请注意,这可能不是微不足道的。如果您的应用程序采用单字节编码,则可能需要检查并修复任何文本操作功能。例如,€ symbol 在 Windows-1252 中的长度为 1 字节,但在 UTF-8 中为 3 字节。假设您有代码将它从像“29.92€”这样的字符串中剥离出来。如果您的应用程序删除了最后一个字节,那么在单字节编码中完美运行的代码在多字节编码中将不再有效,因为一个字节不再是一个字符。或者,即使在 MySQL 本身中,像 regular expressions 这样简单的一些在 MySQL 8.0.4 之前还不是多字节安全的。
解决此问题后,您需要选择适当的排序规则。由于您正在混合语言,因此您需要通用的 Unicode 语言。这是a good overview。
(*) MySQL 实际上是在骗你。当它说 Latin-1 时,它实际上意味着 Windows-1252。
【讨论】:
SELECT substr('29.92€', -1) -> €。我正在使用 utf8mb4 运行。)
(阿尔瓦罗的回答很好;我正在添加一些注释。)
如果您使用的是 MySQL 5.5 或 5.6 并拥有VARCHAR(255),请参阅this 了解您可能遇到的一些问题。
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4;
(对于每个表)可能是转换为 UTF-8 的最简单方法。注意:与生产分开测试,并测试西欧文本不会被破坏。如果出现乱码或问号,请参阅this
在转换为CHARACTER SET utf8mb4 时,首选COLLATION 是utf8mb4_unicode_520_ci。 (在 MySQL 8.0 中,有一个更好的版本。)
utf8mb4 将让您处理所有世界上的语言,所以这应该是最后一次必要的“转换”。
【讨论】: