执行SQL的时候,MySQL出现了下面的1267的错误,提示与字符集有关系。
1 | 1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' |
查找问题的时候,发现有一张表是从其他地方拷贝过来的,这个表和我们目前项目中的表,稍微有点不同。数据表中字符串类型的字段,不仅有字符集这个属性,还有一个排序规则的属性。拷贝过来的表的字符串类型的字段的排序规则是utf8_unicode_ci,而我们的项目中的是utf8_general_ci,修改之后再次执行上述的SQL,就没有出现上面的错误!
下面是问题的简单总结:
1 | ci(caseinsensitive大小写不敏感) |
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了,到现在也没发现问题。。。
详细总结:
1、对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
2、utf8_general_ci也适用与德语和法语,除了‘?’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
用一句话概况上面这段话:utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了。
如何在MySQL5.0中使用UTF8
在 my.cnf中增加下列参数
复制代码代码如下:
1 | [mysqld] |
执行查询 mysql> show variables; 相关如下:
1 | character_set_client | utf8 |
个人见解,对于数据库的使用,utf8_general 已经足够的准确,并且相较与 utf8_unicode速度上有优势,固可放心采用之