首先解释一下问题,大小写敏感分为两个层面:html
经过查询mysql的配置参数,能够得到mysql自己对于varchar
类型的字符存储是不是大小写敏感的:show Variables like '%lower_case_table_names'
,结果是mysql
0
表示大小写敏感;1
表示大小写不敏感;例如,建立一个数据库:sql
CREATE TABLE `test` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
使用的排序规则collation=utf8_general_ci
。数据库
插入数据:函数
insert into test values ('a'); insert into test values ('A');
查询数据在mysql中存储的ascii码:编码
mysql> select name, ASCII(name) from test; +------+-------------+ | name | ASCII(name) | +------+-------------+ | a | 97 | | A | 65 | +------+-------------+ 2 rows in set (0.00 sec)
ASCII
函数返回字符串最左边字符的ascii码。code
存储在数据库中的字符ascii码是不一样的,因此区分了大小写。htm
常见的进行数据比较的场景如:排序
group
,order
在数据比较时,继承
CHAR
, VARCHAR
, TEXT
类型,数据比较会使用数据的排序规则(collation配置);BINARY
, VARBINARY
, BLOB
类型,数据比较二进制的每一个字节;数据库的默认编码通常是charset=utf8
排序规则collation=utf8_general_ci
,那么在比较的时候,非字节类型字符串就是大小写不敏感的。若是使用了相似LIKE 'a%'
,会将a%
和A%
所有获取出来。
utf8_bin
将字符串中的每个字符用二进制数据存储,区分大小写。utf8_genera_ci
不区分大小写,ci为case insensitive的缩写,即大小写不敏感。utf8_general_cs
区分大小写,cs为case sensitive的缩写,即大小写敏感。
若是但愿字符串比较时是大小写敏感的,那么须要修改排序规则。
若是须要在查询中对非字符类型的数据进行比较操做,那么建议将database的排序规则改成utf8_bin
,这样改database下的全部数据库均继承于database的collation支持排序。 若是仅仅是一个表须要支持,那么仅须要更新一个表的collection;甚至仅须要更改一个column的排序规则,也能够更新列的collection。