坑一 字符类型区分大小问题
问题: 如果联合主键报类似下面错误:
MySQLIntegrityConstraintViolationException: Duplicate entry '186699-1-malu8070' for key 'PRIMARY'
分析: 可能是有两条大小写不一致的数据,插入时联合主键忽略大小写,认为这两条数据ID重复,所以会报Duplicate entry
。
例如:186699-1-malu8070
是由三个字段组成的联合主键,该条数据各字段分别对应的值为:186699
1
malu8070
,前两个字段为int类型,不予考虑,第三个字段为varchar类型,如果没有为该varchar字段设置排序规则,则默认会忽略大小写。所以如下两条数据186699-1-malu8070
和186699-1-Malu8070
在插入时认为是一个主键,所以报Duplicate entry
``
解决:
1、 设置该varchar字段字符集为:*_bin
或者 *_cs
- 例如:
contact_num` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '联系方式号码'
- 说明:
– utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
– utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
– utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。
2、 创建字段指定binary。
- 例如:
contact_num` varchar(20) binary NOT NULL DEFAULT '' COMMENT '联系方式号码'
坑二 字符串前后空格问题
问题: 186699-1-malu8070
和186699-1-malu8070
(后面有个空格),在插入时mysql认为是一条数据,也会报Duplicate entry '186699-1-malu8070 ' for key 'PRIMARY' 这种错误
,
分析: mysql默认对字符串前后空格忽略,即联合主键186699-1-malu8070
和186699-1-malu8070
(后面有个空格)认为是一个主键,所以会报Duplicate entry
。
解决: 在插入前进行trim()
处理去除前后空格,然后判断是否相等,相等不执行重复插入操作。
注意:
- 查询和插入一样存在上述两种问题