1. 问题重现
mysql> create database school;
mysql> use school;
mysql> create table student(name varchar(10));
mysql> insert into student values("Clarke");
mysql> select * from student;
+--------+
| name |
+--------+
| Clarke |
+--------+
mysql> insert into student values("唐三");
# 插入中文失败
ERROR 1366 (HY000): Incorrect string value: '\xE5\x94\x90\xE4\xB8\x89' for column 'name' at row 1
2. 分析和解决
2.1 数据库编码设置
2.1.1 查看 MySQL 程序编码设置
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
可以看到,设置里有很多的编码设置是 latin1,这个编码是无法正确显示中文的,如果你的设置也是这样,这就是导致中文编码问题的可能原因。
关于这些设置的含义:
option
desc
character_set_client
客户端使用的字符编码,如果客户端连接时没有设置,或者服务端已配置为忽略客户端的设置
character_set_connection
客户端设置连接数据库时的字符编码,如果客户端没有指明,则连接数据库使用该设置的编码
character_set_database
当前选中数据库的默认字符编码,如果没有选中数据库(use ),则和 character_set_server 的值一致
character_set_filesystem
文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
character_set_results
数据库给客户端返回时使用的编码格式,如果客户端连接时没有指明,则使用该编码
character_set_server
数据库服务器默认编码格式,创建数据库时默认使用
character_set_system
数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式
character_sets_dir
这个变量是字符集安装的目录
|