你有没有过关于MySQL编码方式字符集报错的问题呢?那就让我们一起了解一下吧 hhh
查看支持字符集
我们可以通过如下语句查看MySQL中支持的字符集:
SHOW (CHARACTER SET|CHARACTER) [LIKE 匹配模式];
我们可以看到,如下显示:
其中:
- Charset 表示字符集缩写。
- Description 表示简单描述。
- Default collation 代表此字符集应用的比较规则。
- Maxlen 表示最多用几个字节表示一个字符。
查看比较规则
我们可以使用如下语句对MySQL支持的比较规则进行查看:
SHOW COLLATION [LIKE 匹配模式];
由于一种字符集可能对应多种比较规则,所以展示的结果会更加多,这里就不细说了。
字符集和比较规则的应用
级别划分
在MySQL中有4个级别的字符集和比较规则,分别是服务器级别、数据库级别、表级别、列级别。
-
服务器级别
MySQL中用两个系统变量分别设置服务器级别的字符集和比较规则:character_set_sever 和 collation_server。(关于系统变量的查看和设置之前的文章有讲) -
数据库级别
此级别我们可以在创建和修改数据库时进行设定:
CREATE DATABASE 数据库名
CHARACTER SET 字符集名称
COLLATE 比较规则;
ALTER DATABASE 数据库名
CHARACTER SET 字符集名称
COLLATE 比较规则;
同样,此级别的字符集和比较规则也由两个系统变量来表示:character_set_database 和 collation_server_database,但需要注意的是他们只能用来查看当期数据库应用的字符集和比较规则,不能进行修改。此外,如果我们创建数据库时不进行设定时,默认为服务器级别的字符集和比较规则。
-
表级别
此部分的设置也可以在创建数据库表和修改数据库表时进行,与数据库级别的语句十分类似,这里就不重复了。 -
列级别
我们可以用如下语句进行设置:
CREATE TABLE 表名(
列名 字符串类型 CHARACTER SET 字符集名称 COLLATE 比较规则名称
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 CHARACTER SET 字符集名称 COLLATE 比较规则名称;
注意: 当前级没有设置,就默认用上一级的。
客户端和服务器通讯使用的字符集
客户端和服务器的交互也相当于是在相互发送字符串,那么他们遵循了一种怎样的规则呢?我们一步一步来说:
-
客户端发送请求
当客户端发送请求时(注意:此处说的是mysql自带的mysql客户端)使用的是系统默认的字符集。 -
服务器接收请求
当服务器接收到字符串时,把它看成是 会话变量 character_set_client 所设置的编码方式。(会话变量前边的文章也有讲) -
服务器处理请求
然而,虽然服务器能通过上边的方式,理解了客户端所说的话。但是真正处理的时候还要,将字符集转换成 会话变量 character_set_connection 所设置的编码。我们可以进一步搭配collate_connection 设置的比较规则。
注意: 当character_set_connection设置的字符集,和数据库中某一列涉及比较操作时,列的优先级更高,要统一转成列的字符集和比较规则。 -
服务器响应请求
当我们得到数据库中的数据时,默认还是列的编码格式,至于我们返回给客户端时需不需要进行转换,要看 会话变量 character_set_results 中的设置。 -
客户端接收
这个一般就是用客户端系统自带的字符集喽。
此外,如果启动客户端设置了 default-character-set 就不会用系统默认的编码方式。我们可以在连接上服务器是用如下语句,对上边提到的三个 会话变量进行设置
SET NAMES character_name;