为什么有时候mysql不区分大小写
业务要求一个数据必须是唯一的,通过
1 | select xx,count(*) from xxx group by xx |
发现有重复数据,进一步发现有的其实不是重复,大小写不同,这就引出一个问题:为什么有时候mysql不区分大小写
虽然可以通过binary函数指定区分大小写,但使用函数后索引会失效
1 | select binary(xx),count(*) from xxx group by binary(xx) |
字符集
大小写的问题其实就是字段选用的字符集引起的,创建数据库一般会指定一个默认字符集,如果在建表时不指定字符集就会
使用库的默认字符集.
字符集是指在计算机系统中表示字符的一种方式。在数据库中,字符集指的是数据库表中的数据所使用的字符集。
查看字段字符集
1 | -- 通过以下查看表结构 |
utf8mb4_general_ci,“utf8mb4”指的是字符集,“general_ci”指的是排序规则。
在这个组合中,“utf8mb4”字符集表示使用UTF-8编码,并且可以表示4个字节的Unicode字符。
“general_ci”排序规则表示不区分大小写,但会区分不同的重音符号和大小写变体,ci表示(case insensitive)。
utf8mb4_general_ai_ci也是一种字符集和排序规则的组合,
其中ai是accent insensitive的缩写,意为”不区分重音符号”。在MySQL中,utf8mb4_general_ai_ci表示在排序时忽略重音符号和大小写的影响。
utf8mb4_bin,bin代表binary case sensitive collation,区分大小写
常见字符集
- utf8
- utf8mb4
- utf8mb4_bin
- utf8mb4_general_ci
- utf8mb4_unicode_ci
- utf8mb4_0900_ai_ci