django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

时间:2021-05-20 20:32:09

分析:

1.尝试在Python中对数据转码成utf8,'中文'.encode("utf-8"),还是报错

2.观察堆栈发现应该是操作mysql数据库的时候,将数据插入表里出错

所以第一种方式排除;集中从第二种原因找突破:

在mysql中查看字符相关的变量:

django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

发现character_set_database 编码是latin1不是utf8,问题应该就在这里。

那我们现在就要把这个字符改过来。

这里注意:你们其他变量名的值也不是utf8,这里是你们my.ini配置文件里没有设置,mysql就用的是默认值

[client]

default-character-set =utf8

[mysql]

default-character-set =utf8

[mysqld]

collation-server = utf8_unicode_ci
init_connect ='SET NAMES utf8'
character_set_server=utf8

其中:

init_connect ='SET NAMES utf8' 相当于把charact_set_client ,character_set_server,character_set_connection都设置成utf8了,我怕到时又出啥问题就没去掉了。

我也尝试了在[mysqld]下

添加:character_set_database =utf8 可是启动mysql服务的时候报错。查找资料跟mysql的版本有问题,我mysql的版本是5.6.*

那就只有通过mysql的命令去修改编码了:

set character_set_database=utf8;

在查看的时候编码就修改了

django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

再次测试代码后发现还是有问题。

然后查看了下django连接的数据库,以及生成的表的编码发现编码不是utf8,所以这里还要修改数据库,表的编码

a)查看数据库的编码:show create database databaseName;
b)修改数据库编码: alter database databaseName default character set utf8 collate utf8_general_ci;
a)查看建表的编码:show create table tableName;

修改后查看编码都已经是utf8了应该不会有错了。果然测试可以了。

下面附上mysql的一些相关命令:

通过MySQL命令行修改:
  set character_set_client=utf8;
  set character_set_connection=utf8;
  set character_set_database=utf8;
  set character_set_results=utf8;
  set character_set_server=utf8;
  set character_set_system=utf8;
  set collation_connection=utf8;
  set collation_database=utf8;
  set collation_server=utf8;
修改数据库字符集:
     ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];
     如:
     ALTER TABLE test CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
     修改表的默认字符集:
     ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];
     如:ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
     修改字段的字符集:
     ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...];
     如:ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;