字符集与校对集
字符集
show character set可查看可用字符集(将一系列字符的编码规则组合起来就形成字符集)
显示了字符集名称,描述信息,默认校对集(default collation)和单字符的最大长度(maxLen)
下表展示了可用字符集的部分。
常用字符集有latinl,gbk,utf8
字符集 单字符最大长度 支持的语言
Latinl 1字节 西欧字符,希腊字符等
Gbk 2字节 简体和繁体中文,日文,韩文
Utf8 3字节 世界上大部分国家的文字
单字符占用的存储空间越多,所支持的语言越多
标准的UTF-8(RFC 3629)规定一个字符最多使用4个字节
Mysql从5.5.3版本开始新增了utf8mb4,将一个字符扩展到4个字节。
考虑RFC 3629规范,应使用utf8mb4
校对集 SHOW COLLATION
Mysql中提供了很多校对集,用于为不同字符集指定比较和排序规则。
latinl 字符集默认校对集为latinnl_swedish_ci
校对集用 _ 分隔3部分。第一个部分是对应的字符集,第二部分是国家名,结尾是ci,cs,或bin。其中ci表示不区分大小写,cs表示区分大小写,bin表示二进制方式比较
通过SHOW COLLATION 可以查看mysql可用的校对集。
下图显示了一部分的展示结果。
显示了校对名称(collation) 对应字符集(charset) 校对集(id) 是否对应字符集的默认校对集(default) 是否已编译(compiled)以及排序的内存需求量(sortlen)
字符集与校对集的设置
SHOW VARIABLES LIKE 'character%' 查看与字符集相关的变量,查询结果如下
character_set_client utf8 客户端字符集
character_set_connection utf8 客户端与服务器连接使用字符集
character_set_database
utf8 默认数据库使用的字符集(mysql5.7.6后不推荐)
character_set_filesystem binary 文件系统字符集
character_set_results
utf8 将查询的结果(错误信息或结果集)返回客服端字符集
character_set_server
utf8 服务器默认字符集
character_set_system
utf8 服务器用来存储标识符的字符集
character_sets_dir H:\wamp\bin\mysql\mysql5.7.21\share\charsets\
安装字符集目录
character_set_server决定了新创建的数据库默认使用的字符集。需要注意的是,数据库的字符集决定了数据表的默认字符集,数据表的默认字符集决定了字符的默认字符集。character_set_server的值默认为latinl(所以我们创建库的时候要注意了)
character_set_client character_set_connection 和 character_set_results分别对应客户端,连接层和查询结果的字符集 。通常情况下这三个变量的值是相同的,具体值由客户端的编码而定,从而使客户端输入的字符和查询的结果多不会出现乱码。
通过 “set 变量名 = 值”的命令可以更改变量的值。
set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_result = gbk;
由于上面命令输入太麻烦,可以通过 “set name 字符集” 一次性修改3个变量的值。如:
set names gbk 直接将客户端字符集,客户端与服务器连接字符集,查询结果字符集改成gbk
注意事项
1.set 或 set name修改字符集只对当前会话有效,不影响其他会话,且会话结束后,下次会话(如若不更改)仍然使用默认值。
2.character_set__connection character_set_database 和 character_set_server 对应的校对集分别通过变量colllation_connection collation_database character_server来指定。
通过SHOW VARIABLES LIKE 'collation_%' 可查看与校对集相关的变量
3.若字段使用utf8字符集,而客户端使用gbk字符集,mysql会自动进行编码转换。
由于gbk和utf8本质上是不同的字符集,虽然大部分常见的字符可以转换成功,但若遇到其中一个字符集中没有的特殊字符,则可能出出现乱码。
总结
show character set 查看字符集
SHOW VARIABLES LIKE 'character%' 查看与字符集相关的变量
show engines;查看引擎
SHOW COLLATION 查看校对集
SHOW VARIABLES LIKE 'collation_%' 查看与校对集相关的变量
set names gbk 直接将客户端字符集(character_set_client),客户端与服务器连接字符集(character_set_connection),查询结果字符集(character_set_results)改成gbk
//使用场景
1.数据库(character set + 指定字符集 collate + 指定校对集)
//若仅仅指定字符集,表示使用该字符集默认校对集
//若仅仅指定校对集,表示使用该校对集对应的字符集
#创建数据库,指定字符集为utf8,默认校对集为utf_general_ci
create database pittle character set utf8
#创建数据库,指定字符集为utf8,校对集为utf8_bin
Create database pittle character character set utf8 collate utf8_bin
2.数据表(若没有为数据表指定字符集,则自动使用数据库字符集)
create table pittle.user( …… )character set utf8 collate utf8_bin;
指定数据表的字符集为utf8,校对集为utf8_bin
在mysql中还可以将character set简写为 charset
create table pittle.user( …… )default charset=utf8; //字符集为utf8默认校对集
//pittle.user表示pittle下面的user表
3.字段(若没有为数据表指定字符集与校对,则自动使用数据表字符集和校对)
create table pittle(
username varchar(20) character set uft8 collate utf8_bin
)