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

参考 https://www.cnblogs.com/l10n/p/12606489.html

posted @ 2022-04-26 10:33  rudolf_lin  阅读(1957)  评论(0编辑  收藏  举报