mysql中文乱码问题排查

产生的问题

使用Django时发现数据库数据在页面上显示乱码,英文和数字显示正常,但所有的中文字符显示为"?"

排查过程

排查Django 和系统的问题

  1. Django的字符编码是根据电脑系统自动调整的,所以首先我去检查了一下电脑的字符集。
    a) 在 设置 > 时间和语言 > 语言 > 相关设置 > 管理语言设置 > 管理 > 更改系统区域设置 中查看系统编码;

  2. 我的系统是使用utf-8编码,所以判断应该是数据库的字符编码出现了问题。

排查数据库的问题

  1. 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:…|
+————————–+————————————————

  1. 发现mysql 字段character_set_database = latin1 ,这说明创建数据库时默认其编码格式为Latin1,需要改;

  2. 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 TABLE medicine_customer (
uid varchar(50) CHARACTER SET latin1 NOT NULL,
passwd varchar(50) CHARACTER SET latin1 NOT NULL,
uname varchar(200) CHARACTER SET latin1 NOT NULL,
is_hos tinyint(1) NOT NULL,
PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+——————-+————————————
6. 发现表和字段都是latin1,都需要改

修改方法

有两种修改方法,如果需求是改变所有表和字段的编码方式,使用方法一;如果只想改变字段或表或数据库的编码方式,使用方法二。

方法一:改变所有内容的编码

  1. 将models.py中表的代码移出,随后通过py manage.py makemigrations + py manage.py migrate清空数据库;
  2. 将刚刚移出的代码移回,再运行一次 makemigrations + migrate 重新建立所有的表。新建的表将全部是utf-8的编码。

方法二:只改变某个内容的属性

  1. 改变mysql默认建立数据库的编码格式
    1.1 打开数据库的.ini文件
    1.2 在[client]下加上default-character-set=utf8
    1.3 [mysqld]下加上default-character-set=utf8 init_connect='SET NAMES utf8'
    1.4 重新启动数据库,character_set_database就变成utf8了*

  2. 改变数据库的编码类型
    ALTER DATABASE <database_name> CHARACTER SET utf8;
    e.g ALTER DATABASE django CHARACTER SET utf8;

  3. 改变表的编码类型
    ALTER TABLE <table_name> CHARACTER SET utf8;
    e.g ALTER TABLE medicine_customer CHARACTER SET utf8;

  4. 改变字段的编码类型
    ALTER <table_name> CHANGE <c_name> <cname> <c_name_type> CHARACTER SET utf8;
    e.g ALTER medicine_customer uname uname varchar(50) CHARACTER SET utf8 ;

— end —