mysql建表设置unique的注意事项

背景介绍

在项目中,实际遇到一个问题。随着业务的进行,这边要求对多个产品进行统一登陆接口的功能,这边需要将用户信息表导入SSO中的用户信息中。
实际在导入中发现频繁的报错:ERROR 1062 (23000) at line 1: Duplicate entry '[email protected]' for key 'service_id'
实际通过vim去查询,发现存在这样两条数据,导致信息插入报错:

sql结果.png

分析问题

查看了原有的库,这边确实存在两条数据,但是唯一的不同就是这个qq这两个字符是不同的。分析了两个库的建表语句。


mysql建表设置unique的注意事项_第1张图片
新建数据库.png

mysql建表设置unique的注意事项_第2张图片
旧的数据库.png

通过导出建表语句可以看出,原来的CloudUser表中,对 service_id来说,采用的校对集为'utf8_bin',这个是对大小写敏感的。而新建的表中没有这个限定,默认是大小写不敏感的,所以出现上面报错的那个问题。

解决方案

mysql官方文档.png

从mysql的官方文档看:对于非二进制类型的串,如CHAR、VARCHAR、TEXT,其实是大小写不敏感的。所以,这里需要和旧库一样进行处理,将新库的那个 service_id的字符类型调整成BINARY、VARBINARY、BLOB, ALTER TABLECloudUser MODIFY COLUMNservice_id VARCHAR(128) BINARY;或者如下修改新表 ALTER TABLE CloudUser MODIFY service_id varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE;

参考文献

  • "SQL unique varchar case sensitivity question"
  • "Case Sensitivity in String Searches"

你可能感兴趣的:(mysql建表设置unique的注意事项)