utf8下一个中文字符用三个字节表示,GBK(或gb2312)下一个中文字符用两个字节表示。utf8mb4是强烈建议修改的字符集,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
MySQL的“utf8mb4”
是真正的“UTF-8”。MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。MySQL8.0后默认字符集就是utf8mb4。
如下图所示,分别使用不同命令查看当前数据库字符集:
show variables like '%char%'; show global variables like '%char%';
Linux下编辑/etc/my.cnf
Windows环境下是my.ini,Linux环境下是my.cnf。
[mysql] default-character-set=utf8 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 character_set_server = utf8 init_connect='SET NAMES utf8' #lower_case_table_names=1 忽略大小写 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-character-set = utf8 [mysql.server] default-character-set = utf8 [client] default-character-set = utf8
也可以通过临时会话修改(重启失效):
//客户端需要的 SET GLOBAL character_set_clinet=utf8; //查询连接中的文本编码 SET GLOBAL character_set_connection=utf8; //mysql返回结果的编码 SET GLOBAL character_set_results=utf8; //mysql服务器存储文本的格式 SET GLOBAL character_set_server=utf8; //数据库 SET GLOBAL character_set_database=utf8;
重启mysql服务,查看字符集:
如果脚本文件保存时使用了DOS格式,Linux中可能会看到这样的错误:/bin/sh^M
:损坏的解释器: 没有那个文件或目录。使用VIM命令,进入命令行模式,执行如下操作即可。
:set ff=unix :wq
SET NAMES 'utf8mb4'
语句其与这三个语句等价:
//客户端需要的 SET GLOBAL character_set_clinet=utf8mb4; //查询连接中的文本编码 SET GLOBAL character_set_connection=utf8mb4; //mysql返回结果的编码 SET GLOBAL character_set_results=utf8mb4;
Windows环境MySQL5.7
如果是安装版本且默认安装,那么配置文件my.ini在C:\ProgramData\MySQL\MySQL Server 5.7下面。这里注意哦,是在ProgramData路径下。
MySQL的8个字符集说明
- character_set_client:服务器解码请求时使用的字符集
- character_set_connection:服务器处理请求时会把请求字符串从character_set_client转换为character_set_connection
- character_set_database:当前数据库的字符集
- character_set_server:服务器安装时指定的默认编码格式。
- character_set_results:服务器向客户端返回数据时使用的字符集
- character_set_filesystem
- 文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。
- character_set_system
- 数据库系统使用的编码格式,这个值一直是utf8(有时可以看到是utf8mb3其实就是utf8),不需要设置,它是为存储系统元数据的编码格式。
- character_sets_dir: 这个变量是字符集安装的目录。
在启动mysql后,我们只关注下列变量是否符合我们的要求
character_set_client character_set_connection character_set_database character_set_results character_set_server
下列三个系统变量我们不需要关心,不会影响乱码等问题
character_set_filesystem character_set_system character_sets_dir