产生的问题
使用Django时发现数据库数据在页面上显示乱码,英文和数字显示正常,但所有的中文字符显示为"?"
排查过程
排查Django 和系统的问题
Django的字符编码是根据电脑系统自动调整的,所以首先我去检查了一下电脑的字符集。
a) 在 设置 > 时间和语言 > 语言 > 相关设置 > 管理语言设置 > 管理 > 更改系统区域设置 中查看系统编码;我的系统是使用utf-8编码,所以判断应该是数据库的字符编码出现了问题。
排查数据库的问题
show variables like 'char%';查看 mysql 的默认编码设置
+————————–+————————————————+
| Variable_name | Value > |
+————————–+————————————————+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:…|
+————————–+————————————————
发现mysql 字段
character_set_database = latin1,这说明创建数据库时默认其编码格式为Latin1,需要改;SHOW CREATE DATABASE <database_name>查看数据库的编码———-+—————————————————————–+
| Database | Create Database |
+———-+—————————————————————–+
| django | CREATE DATABASE django /*!40100 DEFAULT CHARACTER SET latin1 */ |
+———-+—————————————————————–+
4. 发现数据库编码是latin1,需要改;
2. SHOW CREATE TABLE <table_name>查看表和字段的编码
——————-+———————————–
| medicine_customer | CREATE TABLEmedicine_customer(
uidvarchar(50) CHARACTER SET latin1 NOT NULL,
passwdvarchar(50) CHARACTER SET latin1 NOT NULL,
unamevarchar(200) CHARACTER SET latin1 NOT NULL,
is_hostinyint(1) NOT NULL,
PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+——————-+————————————
6. 发现表和字段都是latin1,都需要改
修改方法
有两种修改方法,如果需求是改变所有表和字段的编码方式,使用方法一;如果只想改变字段或表或数据库的编码方式,使用方法二。
方法一:改变所有内容的编码
- 将models.py中表的代码移出,随后通过
py manage.py makemigrations + py manage.py migrate清空数据库; - 将刚刚移出的代码移回,再运行一次 makemigrations + migrate 重新建立所有的表。新建的表将全部是utf-8的编码。
方法二:只改变某个内容的属性
改变mysql默认建立数据库的编码格式
1.1 打开数据库的.ini文件
1.2 在[client]下加上default-character-set=utf8
1.3 [mysqld]下加上default-character-set=utf8init_connect='SET NAMES utf8'
1.4 重新启动数据库,character_set_database就变成utf8了*改变数据库的编码类型
ALTER DATABASE <database_name> CHARACTER SET utf8;
e.gALTER DATABASE django CHARACTER SET utf8;改变表的编码类型
ALTER TABLE <table_name> CHARACTER SET utf8;
e.gALTER TABLE medicine_customer CHARACTER SET utf8;改变字段的编码类型
ALTER <table_name> CHANGE <c_name> <cname> <c_name_type> CHARACTER SET utf8;
e.gALTER medicine_customer uname uname varchar(50) CHARACTER SET utf8 ;
— end —