在我的codeigniter项目中,我使用MySQL作为数据库。它的排序规则是“ latin1_swedish_ci”。现在,我需要扩展我的网站来存储“英语”之外的“波兰语”,“德语”,“法语”,“乌克兰语”,“荷兰语”。但是我不知道要使用哪种排序规则。我在网络中针对不同语言找到了不同的答案。但是我需要一个通用的。请帮助我找出解决方案。
答案 0 :(得分:1)
在关心归类之前,您需要首先迁移到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。
答案 1 :(得分:1)
(Alvaro的回答很好;我要添加一些注释。)
如果您使用的是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
将让您处理世界上所有 种语言,因此这应该是最后一次必要的“转换”。