mysql设置字段的排序规则对大小写敏感
在开发中遇到一个问题:在插入一张表中提示主键冲突了,对数据分析了很久,没有发现问题。后面发现是数据库设计的时候设定的排序规则指定的是 COLLATE=utf8_general_ci,而不是用 COLLATE=utf8_bin,这两个规则的区别是什么呢?
- utf8_general_ci:这个排序规则是不区分大小写的,也就是说,在比较和排序字符串时,不考虑字符的大小写差异。例如,"A"和"a"会被认为是相同的。
- utf8_bin:这个排序规则是区分大小写的,也就是说,在比较和排序字符串时,会考虑字符的大小写差异。例如,"A"和"a"会被认为是不同的。它直接按照字符的二进制值进行比较和排序,不考虑语言特定的规则。
实际测试一下:
先建立一张指定排序规则为 utf8_general_ci 的test表:
CREATE TABLEtest
(
RESOURCE_ID
bigint(20) NOT NULL COMMENT '资源ID',
RESOURCE_NAME
varchar(128) NOT NULL COMMENT '资源名称',
CHANGED_TIME
varchar(20) NOT NULL COMMENT '数据变化时间(insert和update)',
TEACHER_NAME
varchar(128) NOT NULL COMMENT '老师名称',
STUDENT_NAME
varchar(128) NOT NULL COMMENT '学生名称',
UNIQUE KEYRESOURCE_ID
(RESOURCE_ID
,TEACHER_NAME
,STUDENT_NAME
)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8 COLLATE=utf8_general_ci;
插入数据
INSERT INTO test (RESOURCE_ID, RESOURCE_NAME, CHANGED_TIME, TEACHER_NAME, STUDENT_NAME) VALUES(1, 'dd-dd', '2022-12-15 16:49:25', 'dd', 'zz');
再次插入一个大写的 DD 老师名称
INSERT INTO test (RESOURCE_ID, RESOURCE_NAME, CHANGED_TIME, TEACHER_NAME, STUDENT_NAME) VALUES(1, 'dd-dd', '2022-12-15 16:49:25', 'DD', 'zz');
此时就会提示报错,主键冲突,SQL 错误 [1062] [23000]: Duplicate entry '1-DD-zz' for key 'RESOURCE_ID'
修改 TEACHER_NAME 的字段编码为 utf8_bin,执行sql: alter table test modify TEACHER_NAME varchar(128) collate utf8_bin not null COMMENT '老师名称';
再次执行插入sql:
INSERT INTO test (RESOURCE_ID, RESOURCE_NAME, CHANGED_TIME, TEACHER_NAME, STUDENT_NAME) VALUES(1, 'dd-dd', '2022-12-15 16:49:25', 'DD', 'zz');
数据写入成功,结果如下: