问题
脚本往mysql中插入数据时突然报错,提示键冲突,但是在代码中我已经用集合过滤掉了以前插入的数据,按理来说是不会出现冲突的.
排查
输入插入异常的数据,去数据库中查询,确实能查到,开始以为是自己的过滤逻辑有问题,可再三确认后都没有问题,于是仔细查看异常的数据与匹配到的数据,发现其大写小有区别.于是问题集中到了mysql的大小写问题上了.
解决
对于已经创建的表,网上找到的版本是修改表的字符集,将其修改为utf8_bin
的形式,如下语句
ALTER TABLE `your_table` COLLATE = utf8mb4_bin;
但是修改后并未生效,后来了解到这里修改后只会对新创建的数据生效.
于是又找到如下语句修改字段的字符集
ALTER TABLE your_table MODIFY `your_field` VARCHAR ( 255 ) BINARY;
其中重点在BINARY
这个关键字
扩展
由于我是使用sqlalchemy
创建的表,因此不可能每次创建表后还要手动去改这些参数,于是在网上我又找到了如下办法
- 设置表的字符集
class MyTable(db.Model):
__table_args__ = {'mysql_collate': 'utf8mb4_bin'}
- 设置字段的字符集
db.Column(db.String(20,collation='utf8mb4_bin'), nullable=False)
网友评论