背景介绍
在项目中,实际遇到一个问题。随着业务的进行,这边要求对多个产品进行统一登陆接口的功能,这边需要将用户信息表导入SSO中的用户信息中。
实际在导入中发现频繁的报错:ERROR 1062 (23000) at line 1: Duplicate entry 'xxx@qq.com' for key 'service_id'
。
实际通过vim去查询,发现存在这样两条数据,导致信息插入报错:
分析问题
查看了原有的库,这边确实存在两条数据,但是唯一的不同就是这个qq这两个字符是不同的。分析了两个库的建表语句。
新建数据库.png 旧的数据库.png
通过导出建表语句可以看出,原来的CloudUser表中,对
service_id
来说,采用的校对集为'utf8_bin',这个是对大小写敏感的。而新建的表中没有这个限定,默认是大小写不敏感的,所以出现上面报错的那个问题。
解决方案
mysql官方文档.png从mysql的官方文档看:对于非二进制类型的串,如CHAR、VARCHAR、TEXT,其实是大小写不敏感的。所以,这里需要和旧库一样进行处理,将新库的那个
service_id
的字符类型调整成BINARY、VARBINARY、BLOB,ALTER TABLE
CloudUserMODIFY COLUMN
service_idVARCHAR(128) BINARY;
或者如下修改新表ALTER TABLE CloudUser MODIFY service_id varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE;
网友评论