MySQL出现1267的错误

执行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
2
3
4
ci(caseinsensitive大小写不敏感)
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。

如果你的应用有德语、法语或者俄语,请一定使用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
2
3
4
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
default-collation = utf8_general_ci

执行查询 mysql> show variables; 相关如下:

1
2
3
4
5
6
7
8
9
character_set_client | utf8 
character_set_connection | utf8
character_set_database | utf8
character_set_results | utf8
character_set_server | utf8
character_set_system | utf8
collation_connection | utf8_general_ci
collation_database | utf8_general_ci
collation_server | utf8_general_ci

个人见解,对于数据库的使用,utf8_general 已经足够的准确,并且相较与 utf8_unicode速度上有优势,固可放心采用之

  • 作者: Sam
  • 发布时间: 2017-12-04 23:21:47
  • 最后更新: 2019-12-09 23:03:26
  • 文章链接: https://ydstudios.gitee.io/post/75a1fb40.html
  • 版权声明: 本网所有文章除特别声明外, 禁止未经授权转载,违者依法追究相关法律责任!