MySQL查询大写小敏感问题
如果你的MySQL表字符集刚好被设置为xxx_ci,比如utf8_generic_ci,如果刚好你做了一个如下查询,如果刚好你的数据库里面刚好有以下这两条记录,如果你足够细心,那么恭喜你应该发现出乎意料的结果。
table user
id name
1 hello
2 HELLO
SQL
select * from user where name=”hello”
结果集
id name
1 hello
2 HELLO
难道不应该是?
id name
1 hello
原来MySQL某些字符集下面默认是不区分查询大小写的,这主要是由mysql的字符校验规则的设置决定的。
简单介绍一下字符校验规则吧
字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则。
校对规则一般有这些特征: 两个不同的字符集不能有相同的校对规则。 每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci。 存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。
所以对于一些比较敏感的数据,应该十分注意字符集。
通常对结尾为『_cs』的字符集为『大小写敏感』型,或者使用『_bin』后续字符集,如utf8_bin.
那么对于已经存在的历史数据应该如何处理呢?
其实针对已经设置为xxx_ci字符集,同时又不得不处理大小写敏感问题的数据我们除了修改字符集以外还可以修改查询语句。
1.在SQL语句中使用collate::select * from user where name collate utf8_bin = ‘hello’;
2.在SQL语句中使用binary操作符:select * from user where binary name = ‘hello’;