标题的完整错误是:
django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE7\\x94\\xA8\\xE6\\x88\\xB7...' for column 'name' at row 1")
如果你在使用 Django 的时候 使用如下命令:
python3 manage.py migrate
的时候遇上这个错误,那么其他打开的博客都可以关掉了!!!
看这篇,完美解决你的问题。
昨天创建了一个 models 然后同步到 MySQL 的时候报了这个错误,网上一搜博客,大体有如下几种解决办法:
1、删除数据库,重新创建数据库的时候指定数据库的编码格式为 utf8
2、在 Django 的 settings.py 文件中的 database 地方添加 test 和 options 模块,里面指定utf8
3、在 Ubuntu 的 MySQL conf 文件地方设置相关参数
4、删除models.py 中的中文字符
以上几种方法来来回回折腾了好几回,然而,并没有什么卵用!!!
气得我重新开了个项目,手把手把东西都恢复过来。
第二天,和同事说了这个问题,他搞了搞,然后沿着一路的轨迹终于找到了解决办法,问题出在 Django 连接的数据库的
django_migrations 表。
我们每次使用 python3 manage.py makemigrations app_name 之后,都会在相应 app 下的 migrations 文件中创建 py 脚本,这些脚本的作用就是用来同步到数据库的。
而 django_migrations 这张表的作用则是记录这些脚本的文件名。
而我们的报错提示里的 name 字段就是来自于这张表。
当我们查看这张表的结构可以发现,这张表的 name 字段的字符设置其实并不是 utf8 编码。
解决办法
所以我们的解决办法是:
- 把表的结构记录下来(show create table django_migrations)
- 删除这张表
- 创建这张表
- 把 models.py 同步到数据库的步骤再操作一遍
完美解决!!!
注意:
可能有的人会说直接修改 django_migrations 的 name 字段的属性应该就可以了吧,我同事操作过,但可能因为之前已经写入了数据,所以并没有起到作用,因此,还是重新创建表来的方便。
感谢:
在此,感谢同事 张x 为此文提供的大力帮助!!!