9. 字符集
9.1. MySQL支持的字符集
MySQL 服务器可以支持多种字符集,在同一台服务器、同一个数据库、甚至同一个表的不同字段都可以指定使用不同的字符集,相比 Oracle 等其他数据库管理系统,在同一个数据库只能使用相同的字符集,MySQL 明显存在更大的灵活性。
(1)查看所有可用的字符集命令:show character set;
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
....
Charset:字符集名称
Description:描述
Default collation:默认校对规则
Maxlen:最大长度
(2)MySQL 的字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。字符集是用来定义 MySQL 存储字符串的方式,校对规则则是定义了字符串的比较方式,排列规则。字符集和校对规则是一对多的关系。
校对格则命名约定:以相关的字符集名开始,并以_ci
(大小写不敏感)、_cs
(大小写敏感)、_bin
(基于字符编码的值比较)。
ci是case insensitive的缩写,cs是case sensitive的缩写
# show collation like '字符名';查看字符集的校对规则
mysql> show collation like 'gbk%';
+----------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+----------------+---------+----+---------+----------+---------+
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | | Yes | 1 |
+----------------+---------+----+---------+----------+---------+
2 rows in set (0.00 sec)
9.2 MySQL字符集的设置
MySQL字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。
9.2.1 服务器字符集和校对规则
服务器字符集和校对,在MySQL服务启动的时候确定。可以在my.cnf中设置,或者启动MySQL服务的时候指定。
# my.cnf添加
[mysqld]
character-set-server=utf8
# 启动项中指定
mysqld -character-set-server=utf8
如果没有特别的指定服务器字符集,默认使用 latin1 作为服务器字符集。
查询当前服务器的字符集和校对规则。
show variables like 'character_set_server';
9.2.2 数据库字符集和校对规则
数据库的字符集和校对规则在创建数据库的时候指定,也可以在创建完数据库后通过“alter database”命令进行修改。需要注意的是,如果数据库里已经存在数据,因为修改字符集并不能将已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容。
9.2.3 表级别的字符集和校对规则
# 创建数据表的时候指定字符集和校对规则
create table tb_name (...) default character set=utf8 collate=utf8_bin;
9.2.4 列字符集和校对规则
列字符集和校对规则的定义可以在创建表时指定,或者在修改表时调整,如果在创建表的时候没有特别指定字符集和校对规则,则默认使用表的字符集和校对规则。
# 查看表字段的字符集
show full columns from col_name;
小结:对于字符集的设置有如下规律
- 如果在指定了字符集和校对规则,使用指定的字符集和校对规则;
- 如果指定了字符集没有指定校对规则,使用指定字符集的默认校对规则;
- 如果没有指定字符集和校对规则,对于server来说,默认为latin1,对于服务器来说,继承server字符集,对表字段也是一样的,默认继承上层的字符集设置。
9.3 连接字符集和校对规则
上面 4 种设置方式,确定的是数据保存的字符集和校对规则,对于实际的应用访问来说,还存在客户端和服务器之间交互的字符集和校对规则的设置。 对于客户端和服务器的交互操作,MylSQL 提供了 3 个不同的参数:character_set_client
、character_set_connection
和 character_set_results
,分别代表客户端、连接和返回结果的字符集,通常情况下,这 3 个字符集应该是相同的,才可以确保用户写入的数据可以正确地读出,特别是对于中文字符,不同的写入字符集和返回结果字符集将导致写入的记录不能正确读出。
9.4. 字符集的修改步骤
如果在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,又不想丢弃这段时间的数据,那么就需要进行字符集的修改。字符集的修改不能直接通过alter database character set
或者alter table tablename character set
命令进行,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。已有记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才可完成。