9.字符集
9.1 字符集概述
字符集就是一套文字符号及其编码、比较规则的集合。
ASCII(American Standard Code for Information Interchange)字符集:采用7位编码,包括大小写英文字母、阿拉伯数字和标点符号,及33个控制符号等。
9.2 Unicode字符集
ISO-10646采用4字节编码,简称UCS-4,将代码空间分为4部分(组group、面plane、行row、格ceil),每部分各占一个字节。
Unicode采用2字节编码,Unicode编码被纳入UCS-4的0组0面,称为基本多语言字面,共65534个码位。
UTF是USC和Unicode格式转换(Transformation Format)的缩写,分为UTF-8和UTF-6.
UTF-8按一定规则将ISO-10646或Unicode字元码转换成1~4个字节的编码,其中将ASCII码(0~0x7F)转换成单字节编码。
9.3 汉字及一些常见字符集
GB 2312-80 双字节编码字符集,收录6763个常用汉字。
GB 13000 除收录GB 2312-80外还收录全部汉字及偏旁部首,共27484个。
GBK 除收录GB 2312-80外还收录中日韩全部汉字及偏旁部首,共20902个。
GB18030 2字节或4字节编码,兼容GB13000和GBK。
字符集 是否定长 编码方式 其他说明
ASCII 是 单字节7位编码 最早的、奠基性字符集
latin1 是 单字节8位编码 西欧字符集
GBK 是 双字节编码
UTF-8 否 1~4字节编码
9.4 怎样选择合适的字符集
考虑因素:UTF-8
满足应用对语言的需求,尽量选择支持多语言的字符集;
考虑对已有数据的兼容;尽量选择已有数据的超集,而非子集;
考虑字符集编码长度对性能的影响,尽量选择编码长度短的字符集;
考虑字符运算对性能的影响,尽量选择定长字符集,而非变长字符集;
考虑客户端程序对字符集的支持,尽量保持前后端字符集一致,避免发生字符集转换。
9.5 Mysql支持的字符集简介
Mysql支持统一台服务器不同的数据库、同一个数据库不同的表、同一个表不同列可以使用不同的字符集。
Mysql字符集分为4个层级:服务器字符集、数据库字符集、表字符集、列字符集。
Mysql字符集包括字符集(character)和校对规则(collation)两部分,
字符集(character)用来定义存储字符串的方式;
校对规则(collation)用来定义比较字符串的方式;
字符集和校对规则是一对多关系,即一个字符集可以有多个校对规则;
每个字符集默认对应一个校对规则。
校对规则命名:
字符集_语言名_ci大小写不敏感
字符集_语言名_cs大小写敏感
字符集_bin基于字符编码的值比较与语言无关,对大小写敏感
查看可用字符集:
show character set;
或者查看information_schema.character_set表
查看某个字符集的所有校对规则和默认校对规则:
show collation like 'gbk%';
或者查看information_schema.collations表
例子:
select case when 'A' COLLATE gbk_chinese_ci ='a' COLLATE gbk_chinese_ci then 1 else 0 end;
select case when 'A' COLLATE gbk_bin ='a' COLLATE gbk_bin then 1 else 0 end;
9.6 Mysql字符集的设置
Mysql字符集分为4个级别:服务器字符集、数据库字符集、表字符集、列字符集。
9.6.1 服务器字符集和校对规则
在my.cnf文件中设置:
[mysqld]
character-set-server=gbk
在启动项中指定:
mysqld --character-set-server=gbk
在编译时指定:
cmake -DDEFAULT_CHARSET=gbk
默认使用latin1作为服务器字符集;
在设置字符集时没有指定校对规则,默认使用字符集默认校对规则;
如果要使用字符集非默认校对规则,则需要在设置字符集时一同设置校对规则。
查看当前服务器字符集和校对规则:
show variables like 'character_set_server';
show variables like 'collation_server';
9.6.2 数据库字符集和校对规则
数据库字符集和校对规则在创建数据库时指定,也可以在创建完数据库后通过alter database命令进行修改。
查看当前数据库字符集和校对规则:
show variables like 'character_set_database';
show variables like 'collation_database';
数据库字符集起效规则:
当设置了数据库字符集和校对规则时,则使用指定的字符集和校对规则;
当设置了数据库字符集且未设置校对规则时,则使用指定的字符集和字符集默认校对规则;
当未设置数据库字符集但设置了校对规则时,则使用指定的校对规则和与该校对规则关联的字符集;
当未设置数据库字符集和校对规则时,则使用服务器字符集和校对规则。
9.6.3 表字符集和校对规则
表字符集和校对规则在创建表时指定,也可以在创建完表后通过alter table命令进行修改。
查看当前表字符集和校对规则:
show create table table_name;
表字符集起效规则:
当设置了表字符集和校对规则时,则使用指定的字符集和校对规则;
当设置了表字符集且未设置校对规则时,则使用指定的字符集和字符集默认校对规则;
当未设置表字符集但设置了校对规则时,则使用指定的校对规则和与该校对规则关联的字符集;
当未设置表字符集和校对规则时,则使用数据库字符集和校对规则。
9.6.4 列字符集和校对规则
在建表时可以为不同列设置不同的字符集,也可以使用alter table table_name modify column col_name为列修改为不同的字符集。
一般表中所有列与表保持相同的字符集和校对规则。
9.6.5 连接字符集和校对规则
连接字符集和校对规则时客户端与服务器交互的字符集和校对规则。
参数character_set_client、character_set_connection、character_set_results分别代表客户端、连接和返回结果的字符集。
这三个参数要保持相同,才能确保写入的数据能够被正确读出。
同时设置3个参数的命令:
set names gbk;
一次设置了3个参数的字符集,但只对一次连接有效。
在my.cnf中设置:
[mysql]
default-character-set=gbk
对所有连接都有效。
字符串常量的字符集由参数character_set_connection决定。
可以通过命令修改字符串常量的字符集,
例子:
select -gbk '字符串常量';
select -utf-8 '字符串常量';
9.7 字符集的修改步骤
将latin1字符集的数据库修改成GBK字符集的过程如下:
1)导出表结构
mysqldump -uroot -p --default-character-set=gbk -d scott > C:\table.sql
说明:
--default-character-set=gbk 设置连接字符集为gbk
-d 只导出表结构,不导出数据
2)手工修改scott.sql中表结构定义中的字符集为新的字符集
3)确保记录不再更新,导出所有记录
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename> C:\data.sql
说明:
--quick 用于转储大的表,强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将它缓存到内存中。
--extended-insert 使用包括几个values列表的多行insert语法,导出文件更小,导入时速度更快。
--no-create-info 不导出create table语句,只导数据
--default-character-set=latin1 按照原有的字符集导出所有数据,保证中文不会出现乱码
4)打开导出文件,将set names=latin1修改为set names=gbk;
5)使用新的字符集创建新的数据库。
create databases db_name default charset gbk;
6)创建表,执行table.sql
mysql -uroot -p db_name < table.sql
7)导入数据,执行data.sql
mysql -uroot -p db_name < data.sql
9.8 小结