mysql唯一索引报错信息只显示前64位
时间:2022-08-27 13:30:00
点击上面的蓝字关注我
MySQL的报错信息有时可能和大家预期的不一样,本文将根据实际案例演示最常见的唯一索引报错与预期情况有差异,不了解的同学可能以为有bug。
1. 数据准备
1.1 创建一个包含唯一索引的表
--创建一张test表 CREATE TABLE test ( id INT PRIMARY KEY AUTO_INCREMENT, c1 VARCHAR (31), c2 VARCHAR (32), c3 VARCHAR (8), c4 INT, UNIQUE KEY uq_c1_c2_c3 (c1, c2, c3) );
1.2 插入一批数据
insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('1','90806443B5534D33B652929F5205E4F','5b612c194383488fad19e2889cf077f5','202204','1000000'); insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('2','988806443B5534D33B652929F5205E4','077f55b612c194383488fad19e2889cf',202205,200000; insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`) values('3','988806443B5534D33B652929F5205E','5b612c194383488fad19e2889cf077f5',202204,100000;
1.3 插入唯一索引冲突的数据
INSERT INTO `test` (`id`, `c1`, `c2`, `c3`, `c4`) VALUES('4','90806443B5534D33B652929F5205E4F','5b612c194383488fad19e2889cf077f202204年,200000年);
错误信息如下:
错误代码:1062 Duplicate entry '90806443B5534D33B652929F5205E4F-5b612c194383488fad19e2889cf077f5' for key 'uq_c1_c2_c3'
只有报错信息c1(90806443B5534D33B652929F5205E4F)和c2(5b612c194383488fad19e2889cf077f5)的值,无c3(202204)值,有时如果批量插入过多行,无法快速定位哪一行冲突,不方便快速调查问题。
2. 原因探索
可以从报错信息中找到,c1、c2接符的总长度为64个字符,可从源码开始。
在源码 errmsg-utf8 以下信息可在文件中找到:
eng "Duplicate entry '%-.64s' for key '%-.192s'"
也就是说,报错信息中有64个字符,key这个名字是192个字符,至此揭开了谜底。
过去的精彩回顾
1.MySQL高可用之MHA集群部署
2.mysql8.新用户和修改加密规则的事情
3. 比hive大数据查询利器快10倍-- presto
4. 监控利器出鞘:Prometheus Grafana监控MySQL、Redis数据库
5. PostgreSQL主要从复制-物理复制
6.MySQL传统点复制在线转向传统点复制GTID模式复制
7.MySQL加密和解密敏感数据
8.MySQL数据备份和还原(1)
9.MySQL数据备份和还原(2)
扫码关注