日期:2014-05-16 浏览次数:21268 次
使用 mysql 创建数据表的时候, 总免不了要涉及到 character set 和 collation 的概念, 之前不是很了解。
?
这两天不是很忙, 就自己整理了一下。
?
?
先来看看 character set 和 collation 的是什么?
&. character set, 即字符集。
我们常看到的 utf-8, GB2312, GB18030 都是相互独立的 character set. 即对 Unicode 的一套编码。
?
?
&. collation, 即比对方法。
用于指定数据集如何排序,以及字符串的比对规则。(这样说可能比较抽象,后面会详细解释。)
?
?
character set 与 collation 的关系
?
软件国际化是大势所趋, 所以 unicode 是国际化最佳的选择。当然为了提高性能,有些情况下还是使用 latin1 比较好。
?
mysql 有两个支持 unicode 的 character set:
1. ucs2: 使用 16 bits 来表示一个 unicode 字符。
2. utf8: 使用 1~3 bytes 来表示一个 unicode 字符。
?
每个 character set 会对应一定数量的 collation. 查看方法是在 mysql 的 console 下输入:
?
mysql> show collation;
?
我们会看到这样的结果:
?
?
collation 名字的规则可以归纳为这两类:
1. <character set>_<language/other>_<ci/cs>
2. <character set>_bin
?
例如:
utf8_danish_ci
?
ci 是 case insensitive 的缩写, cs 是 case sensitive 的缩写。即,指定大小写是否敏感。
奇怪的是 utf8 字符集对应的 collation 居然没有一个是 cs 的。
?
?
?
那么 utf8_general_ci, utf8_unicode_ci, utf8_danish_ci 有什么区别? 他们各自存在的意义又是什么?
?
同一个 character set 的不同 collation 的区别在于排序、字符春对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。
?
例如:
utf8_general_ci 在排序的准确度上要逊于 utf8_unicode_ci, 当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于 utf8_unicode_ci. 例如前者没有对德语中
?
? = ss
?
的支持。
?
而 utf8_danish_ci 相比 utf8_unicode_ci 增加了对丹麦语的特殊排序支持。
?
?
补充:
?
1. 当表的 character set 是 latin1 时,若字段类型为 nvarchar, 则字段的字符集自动变为 utf8.
可见 database character set, table character set, field character set 可逐级覆盖。
?
2. 在 ci 的 collation 下,如何在比对时区分大小写: