编程笔记

lifelong learning & practice makes perfect

mysql字符集|为什么有时候mysql不区分大小写

为什么有时候mysql不区分大小写

业务要求一个数据必须是唯一的,通过

1
select xx,count(*) from xxx group by xx

发现有重复数据,进一步发现有的其实不是重复,大小写不同,这就引出一个问题:为什么有时候mysql不区分大小写

虽然可以通过binary函数指定区分大小写,但使用函数后索引会失效

1
select binary(xx),count(*) from xxx group by binary(xx)

字符集

大小写的问题其实就是字段选用的字符集引起的,创建数据库一般会指定一个默认字符集,如果在建表时不指定字符集就会
使用库的默认字符集.

字符集是指在计算机系统中表示字符的一种方式。在数据库中,字符集指的是数据库表中的数据所使用的字符集。

查看字段字符集

1
2
3
4
5
6
7
8
9
-- 通过以下查看表结构
describe tablename;

-- 表的创建语句,会返回字段使用的字符集
SHOW CREATE TABLE tablename;
CREATE TABLE `user_info` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
)ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC

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

欢迎关注我的其它发布渠道