mysql 校对规则作用_mysql的校对规则引起的问题分析

mysql的校对规则引起的问题分析

更新时间:2008年10月25日 18:56:39   作者:

在以前用oracle的时候,很少关于它的collation方法,但是在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陶_陶的数据也取回来了。

这显然是不允许的。

查看它们的编码:

(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引起的问题。

show variables查看

| collation_connection | latin1_swedish_ci

| collation_database | latin1_swedish_ci

| collation_server | latin1_swedish_ci

手工把这些参数修改为latin1_bin,结果居然一样。这下感觉真是奇怪了。

这里先解释一下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 现代西班牙

最后我们将表格重建,手工指定表格级别的collation为latin1_bin。

这个问题就得到了解决。

那么问题又来了,为什么我前面手工测试latin1_bin时不生效呢?

原来MySQL按照下面的方式选择表字符集和 校对规则:

如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。

如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。

否则,采用服务器字符集和服务器校对规则。

而我们在建表的时候指定了character set,所以它永远是采用对应的默认的校对规则。

当然我们其实也没必要重建表格,只需要alter table db_allot CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin这样转换即可。

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

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了mysql数据迁徙方法工具解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要为大家详细介绍了Mysql利用group by分组排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-12-12

0ea3c7666119d5615e582f823fb3fad6.png

网上看到了不错的mysql下常见错误解决方法,特整理下,方便大家学习mysql2008-02-02

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要为大家详细介绍了linux下使用RPM安装mysql5.7.17的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03

8cc1031babc6aff2319f1c6af8544aa0.png

本文介绍了“内网ssh/mysql登录缓慢的解决方法”,需要的朋友可以参考一下2013-03-03

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要介绍了MySQL如何实现负载均衡功能,学习过数据库的朋友们都会知道MySQL,那么如何在MySQL下实现负载均衡功能呢?本文就将为大家细致地介绍一下2019-06-06

cca732bf65a93ed2ec0ac80c638460fe.png

今天小编就为大家分享一篇关于B-Tree的性质介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01

2d9f31f2af7b675a3d153d2b7f1035a7.png

今天小编就为大家分享一篇关于mysql unique key在查询中的使用与相关问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-04-04

b452cee8ec5cd9e58ab98eba17281e59.png

本文给大家带来Centos 6.5 下安装mysql 5.6.21的方法,操作方法比较简单,介绍的非常详细,感兴趣的朋友可以参考下操作步骤2016-09-09

f4838ec7e2d4da28e0b57d4e852dadd4.png

下面小编就为大家带来一篇MySQL一个语句查出各种整形占用字节数及最大最小值的实例。2017-03-03

最新评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值