Django创建的网站,数据库为mysql会经常出现管理网页录入中文出错的问题,
一般会有这样的反馈:Incorrect string value ‘\x32\xf4\xAE’
出现这种问题不要慌,一看反馈就知道是编码问题,但是会是什么编码问题呢,一般将数据库mysql换成django自带的数据库SQLIT就不会出现这种问题,我已我们将目标锁定在数据库mysql上,我们可以利用mysql人机交互软件MySQLWorkbench
或者直接利用终端登录mysql进行查看
利用代码:
show variables like'%char%'
查看Mysql配置的编码:(下图是本人的编码配置,是我修改后的配置,我的Mac机器安装的时候character_set_server 是latin1格式的)
所以我们要更改一下其配置编码,重点能容如下:
1.关闭本地的Mysql服务(有两种方式)
- 通过系统偏好设置,找到最下变得Mysql图标
- 点进去之后选择Stop MySQL Server
- 通过代码:
-
sudo /usr/local/mysql/support-files/mysql.server stop
2. 修改mysql配置文件
Mac 上没有其配置文件/etc/my.cnf 需要我们从mysql安装地点我的是:/usr/local/mysql-5.7.17/的support-files/的my-default.cnf拷贝一份出来命名为my.cnf,内容我们修改为:
# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
default-character-set=utf8
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
server-id = 1
# Uncomment the following if you want to log updates
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /usr/local/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
主要的修改是:
[client]部分加入:
default-character-set=utf8
[mysqld]部分加入:
character-set-server=utf8
如果是通过vi 修改的cnf文件不要忘了wq保存。
3.最后一步重启MySQL服务
终端输入 :mysql -u root -p 然后输入你数据库的密码
进入以后进行一下的操作
4. 删除之前的数据库
把之前的数据库需要的数据,重要的保存一下,然后删除掉
5. 重新创建一个UTF-8编码的数据库
CREATE DATABASE <数据库名称> DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
6. 同步数据库
python3 manage.py makemigrations
python3 manage.py migrate
最后登陆一下后台查看插入中文字符后成功的样子吧。
注:
如果Mysql密码忘记,重置密码请查看这个链接:忘记密码的情况下修改MySQL的密码