之前在django中使用mysql数据库进行配置时,用migrate写入数据表的时候,提示
django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE7\\x94\\xA8\\xE6\\x88\\xB7...' for
这是由于我们的model中的字符与数据库自身的字符集不匹配,在数据库中查询字符集
show variables like ‘char%’
看到编码方式不是我们想要的utf8 的方式,如果用
set character_set_database=utf8;
set character_set_server=utf8;
发现退出重启后依然不行。此时就需要修改数据库的默认编码配置,一般网上教程都是找my.cnf.这里就不在赘述了,这里强调一点,Linux下有的人可能无法找到my.cnf,需要通过如下的步骤:
># which mysqld 得到一个路径×××,例如/usr/share/mysqld
>#/usr/share/mysqld --verbose --help |grep -A 1 'Default options'命令来查找mysqld使用的配置文件路径,然后就可以找到my.cnf。最好将其复制到/etc/下面,方便下次查找,以及备份用。
打开my.cnf进行修改,加入以下的配置:
在开头处加:
[client]
default-character-set=utf8
在结尾加上:
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
保存即可,service mysql restart 重启mysql,查看字符集就已经改过来了。
到这里,有的会发现自己用django使用migrate命令仍然报错,是因为你设置utf8之前你的数据库就已经建立了,此时的数据库编码集仍是之前的编码配置,所以要修改你数据库的编码集才可以正常使用。
接着在django中配置mysql,基本参数如下:
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'HOST':'127.0.0.1',
'PORT':'3306', #可不填,默认的
'NAME':'database_name', # 数据库名
'USER':'username',
'PASSWORD':'password',
'OPTIONS':{ #可选的,可以不写
'init_command':"SET sql_mode='STRICT_TRANS_TABLES'"
},
}
}
注意mysql5以上会支持三种模式,
# ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
# TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
# STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。
如果我们用的是Python3开发的,就没办法使用mysqldb驱动,此时推荐的是用pymysql,但是django默认是mysqldb,所以需要在你项目的init.py文件里添加如下代码:
import pymysql
pymysql.install_as_MySQLdb()
即可正常使用mysql,跟用orm操作sqlite一样。