思路话语

。Arlen:思想有多远你就能走多远...

mysql字符集和校对

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

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


取cn象_王的数据,居然把cn陶_陶的数据也取回来了。

 

针对中文,我们在取数或者排序时只要加上校对规则latin1_bin就不会有问题,

如上面这个取数的,改为 select to_id from test where to_id='cn象_王' collate latin1_bin

甚至惊喜的发现,在order by *** 后面用latin1_bin作校对后,汉字竟然是按拼音排序!太意外了!

 

下面这段来自手册:

 

校对规则一般有这些特征:

·         两个不同的字符集不能有相同的校对规则。

·         每个字符集有一个默认校对规则。例如,latin1默认校对规则是latin1_swedish_ci

·         存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。

 

 

10.3.10. BINARY操作符

BINARY操作符是COLLATE子句的一个速记符。BINARY 'x'等价与'x' COLLATE y,这里y是字符集'x'二元 校对规则的名字。每一个字符集有一个二元校对规则。例如,latin1字符集的二元 校对规则是latin1_bin,因此,如果列a是字符集latin1,以下两个语句有相同效果:
SELECT * FROM t1 ORDER BY BINARY a;
SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;

 

 

posted on 2010-06-18 13:32  Arlen  阅读(130)  评论(0编辑  收藏  举报

导航