已经将Django 2.x和MySQL 5.7一起用于许多项目。很久以前,就遇到了一个问题,即不同的表/列之间的字符集/排序规则不同,从而触发“ 1215,'无法添加外键约束'” IntegrityError。
至少一年或更长时间以来,通过将以下内容添加到我在settings.py中的所有数据库定义中解决了该问题:
init_command": "SET character_set_connection=utf8mb4, collation_connection=utf8mb4_unicode_ci;
在添加init命令之后,通过迁移通过Django创建和更新的所有表的确设置为utf8mbf_unicode_ci。 (我今天回去验证了这一点。)
现在,无处不在:今天花了数小时来解决在较旧项目上迁移失败的问题。最初并没有查看排序规则问题,因为数据库或Django连接器中的内容均未更改。
瞧,所有新表都被创建为utf8mb4_general_ci,因此,尽管试图对现有_unicode_ci表写入外键,却崩溃了,尽管init_command尚未进行任何更改。
我尝试使用ALTER TABLE转换/回滚所有受影响的表,以转换为所需的排序规则,但是迁移文件所做的任何更改都隐式地再次转换为_general_ci。
我回顾了我的最后几个项目,并且至少在过去的一两个月中,我看到init_command不再导致应用指定的排序规则。 (由于更改在每个新项目中都是一致的,因此不会触发任何错误来警告更改。)在此期间,MySQL(5.7),Python(3.7)或MySQLclient(1.3.13)模块中的版本没有更改,但是在此期间,Django的版本从2.0.7升级到2.2.2。
最终,我可以通过手动创建外键约束来解决紧迫的问题。在完成工作的同时,此更改使旧的非general_ci项目的工作变得乏味。
还有其他人遇到这个问题吗?如果是这样,您是否找到了一种变通办法,可以再次让您指定所有迁移的默认排序规则?
更新:我已经尝试将MySQLclient更新到最新版本(1.4.4),但是问题仍然存在。