MYSQL 数据库大小写敏感问题。
查看
show variables like "%case%"
大小写敏感 1表示 不敏感 默认为0
lower_case_table_names=1
说明
①关于lower_case_table_names参数对表名称或数据库名称大小写敏感的控制。
②Unix下默认为0,也就是大小写敏感的;Windows下默认为1,不敏感;macOS默认为2,存储区分大小写,但是在查询时会转换为小写。
③对于在大小写不敏感的系统(Windows和macOS)不能将该字段设置为0。
重点
①linux默认情况下,对数据库名和表名的大小写是敏感的,因为linux系统本身对大小写就敏感。
②字段内容大小写不敏感。坑来了!!!!!!!!!!!!!!!!!!!!
③列名大小写不敏感。
问题
对字段内容大小写不敏感 ,那么查询就有如下现象
生产问题
组合字段 unique,但是内容是大小写不敏感的 。
所以, aa 和 AA , 系统认为是一样的 ,唯一索引就有问题。
解决方式
查询的时候, 加上binary 函数。 (但是,这会导致索引失效!!!!!!!!!)
更换排序字符集 xx_bin , 比如 utf8_bin. (目前的实现方式)
索引正常 。
alter table testcase MODIFY name varchar(60) COLLATE utf8_bin;
可以走索引。查询也ok
副作用:因为更改了排序方式,所以单纯查字段的话 ,返回数据集的排序方式变了。(个人感觉,正常业务上不影响)
alter table testcase MODIFY name varchar(60) COLLATE utf8_general_ci ;
select name from testcase ;
alter table testcase MODIFY name varchar(60) COLLATE utf8_bin;
select name from testcase ;
使用xx_cs(case sensitive) 的字符集。
**目前mysql5.7 不支持。 **
show COLLATION like 'utf8%';
utf8_general_ci utf8 33 Yes Yes 1
utf8_bin utf8 83 Yes 1
utf8_unicode_ci utf8 192 Yes 8
utf8_icelandic_ci utf8 193 Yes 8
utf8_latvian_ci utf8 194 Yes 8
utf8_romanian_ci utf8 195 Yes 8
utf8_slovenian_ci utf8 196 Yes 8
utf8_polish_ci utf8 197 Yes 8
utf8_estonian_ci utf8 198 Yes 8
utf8_spanish_ci utf8 199 Yes 8
utf8_swedish_ci utf8 200 Yes 8
utf8_turkish_ci utf8 201 Yes 8
utf8_czech_ci utf8 202 Yes 8
utf8_danish_ci utf8 203 Yes 8
utf8_lithuanian_ci utf8 204 Yes 8
utf8_slovak_ci utf8 205 Yes 8
utf8_spanish2_ci utf8 206 Yes 8
utf8_roman_ci utf8 207 Yes 8
utf8_persian_ci utf8 208 Yes 8
utf8_esperanto_ci utf8 209 Yes 8
utf8_hungarian_ci utf8 210 Yes 8
utf8_sinhala_ci utf8 211 Yes 8
utf8_german2_ci utf8 212 Yes 8
utf8_croatian_ci utf8 213 Yes 8
utf8_unicode_520_ci utf8 214 Yes 8
utf8_vietnamese_ci utf8 215 Yes 8
utf8_general_mysql500_ci utf8 223 Yes 1