适用于英语,波兰语和德语的MySQL整理

时间:2019-02-08 05:55:00

标签: mysql collation

在我的codeigniter项目中,我使用MySQL作为数据库。它的排序规则是“ latin1_swedish_ci”。现在,我需要扩展我的网站来存储“英语”之外的“波兰语”,“德语”,“法语”,“乌克兰语”,“荷兰语”。但是我不知道要使用哪种排序规则。我在网络中针对不同语言找到了不同的答案。但是我需要一个通用的。请帮助我找出解决方案。

2 个答案:

答案 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时,首选COLLATIONutf8mb4_unicode_520_ci。 (对于MySQL 8.0,有一个更好的选择。)

utf8mb4将让您处理世界上所有 种语言,因此这应该是最后一次必要的“转换”。