问题背景
由于每天都需要对公司的数据进行一个统计,公司工作人员在对账的时候,发现有一天没有查到记录,于是我就把程序统计调整到没有记录的那天重新统计入库。奇怪的事情发生了,数据插入不进去,唯一索引报Duplicate entry for key xxx的错误。
解决过程
- 首先我去表中看了,唯一索引的确没有重复
- 为了排除其他数据的影响,直接将表中数据清空了(当然是本地环境),依然报错
- 打断点,输出,对重复的那个key进行debug,看数据统计是否有有重复的,控制台指打印出一次,debug也只停留一次。
进行上面三个操作之后,并没有任何卵用,这就让我很纳闷了。虽然我们进行插入之前可以判断是否已经存在该条记录,存在就不入库,不存在就入库,但这显然不是根本原因所在。程序没有看到任何问题,接下来就只能直接操作数据库,进行查询了。报的是唯一索引重复了,我就查询那个唯一索引,好家伙,神奇的事情发生了。
我查询的是全部小写的字符串"titapotp",结果如下图所示:
这里问题的根本原因就自己出来了,mysql查询的时候字符串是不区分大小写的😮💨
解决方式
所以解决办法就是查询的时候强制区分大小写。
有以下几个方法解决:
1. 让mysql查询时区分大小写
select * from usertable where binary 字段名=‘xxxx';
2.在建表时加以标识
create table `usertable`(
字段名 varchar(32) binary,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
或者
CREATE TABLE `usertable` (
字段名 varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
因为我的表已经是建立的了,不必去删除重建,所以只要将account那个字段改为二进制即可。
平时使用的数据库可视化工具navicat居多,所以我直接在navicat进行如下操作:
直接勾选二进制即可,这样查询的时候会强制区分大小写了。还有一种就是将排序规制设置为二进制的,如下图所示:
其实两个都是一样的,勾选为二进制点击保存之后排序规则直接变成了二进制的。如下图示:
进行如下操作之后,再次查询就OK了。