首页 > 数据库 >mysql设置字段的排序规则对大小写敏感

mysql设置字段的排序规则对大小写敏感

时间:2023-05-30 11:55:07浏览次数:51  
标签:RESOURCE NAME utf8 dd TEACHER 字段 大小写 mysql ID

在开发中遇到一个问题:在插入一张表中提示主键冲突了,对数据分析了很久,没有发现问题。后面发现是数据库设计的时候设定的排序规则指定的是 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_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 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');
数据写入成功,结果如下:

标签:RESOURCE,NAME,utf8,dd,TEACHER,字段,大小写,mysql,ID
From: https://www.cnblogs.com/fightingdeng1998/p/17442866.html

相关文章

  • Mysql DDL执行方式-pt-osc介绍 | 京东云技术团队
    1引言大家好,接着上次和大家一起学习了《MySQLDDL执行方式-OnlineDDL介绍》,那么今天接着和大家一起学习另一种MySQLDDL执行方式之pt-soc。在MySQL使用过程中,根据业务的需求对表结构进行变更是个普遍的运维操作,这些称为DDL操作。常见的DDL操作有在表上增加新列或给某个列添加索引......
  • MySQL之运算符大全
    注:测试建表语句一:算数运算符算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。注:在MySQL中和NULL进行计算操作的都为NULL;如SELECT 10+NULLFROMDUAL 返回NULL1:加法与减法运算SELE......
  • mysql开启审计(windows)
    环境:OS:windows2008DB:mysql5.7 1.获取到安全审计插件可以下载mariadb后,解压找到server_audit.ddl我这里下载的mariadb版本是10.4.29下载地址:https://mariadb.org/download/2.将server_audit.ddl拷贝到mysql插件的路径下路径为:D:\mysql57\lib\plugin 3.登录mysql......
  • es mysql 适用场景对比
    esmysql适用场景对比问题一全文检索毫无疑问直接上es,那么除了这种场景,什么时候该选es?为啥mysql不行?对枚举字段的搜索mysql创建索引的原则是对于那些区别度高字段建立索引,区别度越高的索引,在数据量大的情况下,索引效果越好。因为mysql建立b+树时是这样,每创建一行就新建立索引......
  • 【EXPLAIN】MySQL执行计划分析
    目录什么是执行计划?如何获取执行计划?执行计划结果分析idselect_typetabletype(重要)possible_keyskey(重要)key_lenrowsExtra(重要)什么是执行计划?执行计划是指一条SQL语句在经过MySQL查询优化器的优化会后,具体的执行方式。执行计划通常用于SQL性能分析、优化等场景。通过EXP......
  • js 以多字段为维度汇总某一字段值
    js以多字段为维度汇总某一字段值JavaScript可以以多个字段为维度进行汇总。你可以使用多个for循环或forEach循环,针对每个字段进行分组。然后使用reduce方法进行汇总。举个例子,假设你有一个数组数据如下:letdata=[{name:'Alice',age:25,city:'NewYork',......
  • MySQL-日期时间类型比较、互转
    【原理】日期、时间类型比较比较的是时间戳,即long型 【原理】日期、时间类型和字符串比较当涉及日期类型、时间类型和字符串类型比较时,会先将字符串转换成日期、时间类型,然后进行比较;例如:date_col<"2020-09-01",date_col是date类型,在比较时,会先将"2020-09-01"转换成dat......
  • 误删生产数据?利用mysql的Binlog进行恢复操作
    恢复至某个时间段的Mysql操作,和查看sql重新执行被删sql如果不小心删除了生产数据,你又想批量恢复,只要你的mysql开启了binlog,那么是可以恢复的。1、检查是否开启binlogshowvariableslike'log_%';保证为ON,记录下log_bin_basename,这是你的binlog存放位置如:/var/lib/mysql......
  • net6 使用 efcore 根据 mysql数据库生成代码
    1.vs中下载程序NuGet包Microsoft.EntityFrameworkCore.ToolsPomelo.EntityFrameworkCore.MySql 把这两个安装好就可以了或者你嫌麻烦也可以直接用命令下载 打开VS2019"工具"->"Nuget包管理器"->"程序包器管理控制台"PM>Install-PackageMicrosoft.EntityFrameworkCore.Too......
  • 通过 docker-compose 快速部署 MySQL保姆级教程
    目录一、概述二、前期准备1)部署docker2)部署docker-compose三、创建网络四、MySQL编排部署1)构建镜像Dockerfile2)配置文件2)编排docker-compose.yaml3)开始部署五、简单测试验证六、常用的MySQL客户端命令1)连接到MySQL服务器2)显示当前数据库列表3)选择数据库4)显示当前数据库的所......