最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

mysql设置字段的排序规则对大小写敏感_焦点精选

来源:博客园


(资料图片仅供参考)

在开发中遇到一个问题:在插入一张表中提示主键冲突了,对数据分析了很久,没有发现问题。后面发现是数据库设计的时候设定的排序规则指定的是 COLLATE=utf8_general_ci,而不是用 COLLATE=utf8_bin,这两个规则的区别是什么呢?

  1. utf8_general_ci:这个排序规则是不区分大小写的,也就是说,在比较和排序字符串时,不考虑字符的大小写差异。例如,"A"和"a"会被认为是相同的。
  2. utf8_bin:这个排序规则是区分大小写的,也就是说,在比较和排序字符串时,会考虑字符的大小写差异。例如,"A"和"a"会被认为是不同的。它直接按照字符的二进制值进行比较和排序,不考虑语言特定的规则。实际测试一下:先建立一张指定排序规则为 utf8_general_ci 的test表:CREATE TABLE test(RESOURCE_IDbigint(20) NOT NULL COMMENT "资源ID",RESOURCE_NAMEvarchar(128) NOT NULL COMMENT "资源名称",CHANGED_TIMEvarchar(20) NOT NULL COMMENT "数据变化时间(insert和update)",TEACHER_NAMEvarchar(128) NOT NULL COMMENT "老师名称",STUDENT_NAMEvarchar(128) NOT NULL COMMENT "学生名称",UNIQUE KEY RESOURCE_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");数据写入成功,结果如下:

关键词: