这篇文章详细介绍一下MySQL中的字符集和字符序相关的问题,里里外外地了解一下字符集和字符序的方方面面,同时重点说明一下开发中需要注意的问题。
文章基于MySQL 8.0,也会涉及到5.7版本。主要参考MySQL手册:https://dev.mysql.com/doc/refman/8.0/en/
1. 太长不爱看版
- 字符集(Character Set)是字符的编码规则,字符序(Collation)是字符的排序规则;
- 每一个字符集都包含一定范围的字符;
- 每一个字符集都有一个或多个字符序,其中一个字符序为默认字符序;
- 每一个字符序都有一个相关联的字符集;
- 两个不同的字符集没有相同的字符序;
- 相同数据使用不同的字符序排序结果可能会不同;
- MySQL支持服务(server)、数据库(database)、表(table)、字段(column)以及字符串字面量(string literal)等多个级别的字符集与字符序的设置;
- 库表创建以及程序中尽可能使用
utf8mb4
字符集(可支持emoji); - MySQL中的
utf8
字符集是utf8mb3
字符集的别名,避免使用; - MySQL 5.7的服务默认字符集是
latin1
,而8.0中是utf8mb4
; - 通过
SHOW CHARACTER SET
查看当前服务器所支持的字符集; - 通过
SHOW COLLATION
查看所有的字符序; - MySQL中有多个关于字符集和字符序的系统变量,可以针对全局以及当前session进行设置;
- 通过
SHOW VARIABLES LIKE "character_set%"
查看当前服务以及数据库的字符集设置; - 使用client客户端连接数据库时,如果编码有问题,可以通过
SET NAMES charset_name
来设置和数据库一致的字符集; - 库表内容在不同字符集之前转换可能会发生数据丢失问题。
2. 什么是字符集与字符序
在大多数情况下,我们并不需要了解字符集与字符序,但是在涉及到不同字符集的转换时可能会出现问题,这时了解一下相关的知识还是有帮助的。
我们首先了解一下字符集的原理。
2.1 字符与字符集
字符是我们经常接触到的东西,比如a、中、ß,以及