Django------Linux下修改mysql配置

之前在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一样。


















你可能感兴趣的:(Django学习,Mysql)