MySQL 的 collation

来源:百度文库 编辑:神马文学网 时间:2024/04/28 14:56:59
MySQL 的 collation  1. mysql collation的命名规则:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束比如latin1字符集有以下几种校正规则:

     校对规则                含义
latin1_german1_ci 德国DIN-1
latin1_swedish_ci   瑞典/芬兰
latin1_danish_ci     丹麦/挪威
latin1_german2_ci 德国 DIN-2
latin1_bin                符合latin1编码的二进制
latin1_general_ci    多种语言(西欧)
latin1_general_cs   多种语言(西欧ISO),大小写敏感
latin1_spanish_ci    现代西班牙

2. MySQL选择表字符集和校对的规则:
如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y;如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。否则,采用服务器字符集和服务器校对规则。


3. 而我们在建表的时候只指定了character set,所以它永远是采用对应的默认的校对规则。没必要重建表格,只需要alter table mytable CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin这样转换即可。

4. 建议collation都尽量采用字符集相应的bin类型的校对规则,这样不容易出错。

5. collation引起的问题。

一张test的表,字符集采用的latin1。

select to_id from test where to_id='cn象_王';
+---------------+
| to_id |
+---------------+
| cn陶_陶 |
| cn象_王 |
+---------------+
2 rows in set (0.00 sec)


取cn象_王的数据,居然把cn陶_陶的数据也取回来了。这显然是不允许的。


查看它们的编码:

(root@im_offlog1a)[test]> select hex('cn陶_陶');
+----------------+
| hex('cn陶_陶') |
+----------------+
| 636ECCD55FCCD5 |
+----------------+
1 row in set (0.00 sec)

(root@im_offlog1a)[test]> select hex('cn象_王');
+----------------+
| hex('cn象_王') |
+----------------+
| 636ECFF35FCDF5 |
+----------------+
1 row in set (0.00 sec)

编码的确是不一样的,但是为什么mysql会认为这两条记录是一样的呢?── collation引起的问题。

参考:

http://blog.csdn.net/xfsnow/archive/2008/09/05/2885948.aspx

http://www.bizeway.net/read.php/325.htm