mysql中varchar 大小写敏感问题

首先解释一下问题,大小写敏感分为两个层面:html

  1. varchar类型的值,insert 和 select 的结果是不是大小写敏感的?
  2. varchar类型的数据在比较的时候是不是大小写敏感的?

insert 和get 是否大小写敏感

经过查询mysql的配置参数,能够得到mysql自己对于varchar类型的字符存储是不是大小写敏感的:show Variables like '%lower_case_table_names',结果是mysql

  1. 0表示大小写敏感;
  2. 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

varchar类型的数据比较是不是大小写敏感

常见的进行数据比较的场景如:排序

  1. 使用了比较运算符,$>=, >, =, <, <=$
  2. 排序操做,group,order
  3. like操做

在数据比较时,继承

  1. 非字节类型数据,如CHAR, VARCHAR, TEXT类型,数据比较会使用数据的排序规则(collation配置);
  2. 字节类型数据,如BINARY, VARBINARY, BLOB类型,数据比较二进制的每一个字节;
  3. 非字节类型数据和字节类型数据比较会按照字节类型数据比较规则进行。

数据库的默认编码通常是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。

参考

  1. case-sensitivity
相关文章
相关标签/搜索