字符集表示的是存储的二进制与字符如何映射的关系,比较规则指的是字符如何排序的规则,好比字符若是使用order by到底按什么规则进行排序。mysql
查看支持的字符集命令是:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式]
,CHARACTER SET|CHARSET赞成,二者均可以用。sql
查看支持的比较规则命令是:SHOW COLLATION [LIKE 匹配的模式]
。数据库
注意,比较规则的命名方式有必定规律,通常来讲,知足:服务器
比较规则名称以与其关联的字符集的名称开头编码
后边紧跟着该比较规则主要做用于哪一种语言,好比utf8_polish_ci表示以波兰语的规则比较,utf8_spanish_ci是以西班牙语的规则比较,utf8_general_ci是一种通用的比较规则。spa
名称后缀意味着该比较规则是否区分语言中的重音、大小写啥的,具体能够用的值以下:code
后缀 | 英文释义 | 描述 |
---|---|---|
_ai | accent insensitive | 不区分重音 |
_as | accent sensitive | 区分重音 |
_ci | case insensitive | 不区分大小写 |
_cs | case sensitive | 区分大小写 |
_bin | binary | 以二进制方式比较 |
好比咱们经常使用的utf8_general_ci这个比较规则是以ci结尾的,说明不区分大小写进行比较。server
utf8和utfmb4是咱们经常使用的字符集,这二者有什么区别勒?实际上真正的UTF-8 是1-4个字节,可是mysql里面的utf8不是指的这个,而是指的utf8mb3,其中mb表示的是最多占用多少个字节,mysql最开始为了节省空间资源偷偷把utf-8给阉割了,用1-3个字节表示,实际上1-3个字节也足够表示咱们日常使用的字符了。而实际上utfmb4才是真正的utf8,能映射全部的unicode码。blog
MySQL有4个级别的字符集和比较规则,包括服务器级别、数据库级别、表级别、列级别,对于一个表的列,这几个级别粒度越具体的越优先使用,在建立数据库、表、列的时候,若是没有具体指定用什么字符集和比较规则,自动引用上一级别的配置。咱们接下来看看各个级别的字符集和比较规则具体怎么设置。排序
系统变量 | 描述 |
---|---|
character_set_server | 服务器级别的字符集 |
collation_server | 服务器级别的比较规则 |
如图,服务器级别的字符集和比较规则由系统变量character_set_server和collation_server控制,查看和修改命令上一篇文章介绍过。咱们能够经过启动选项、配置文件、运行时更改来设置它。
数据库级别的字符集和比较规则的系统变量为:
系统变量 | 描述 |
---|---|
character_set_database | 当前数据库的字符集 |
collation_database | 当前数据库的比较规则 |
若是想查看当前数据库使用的字符集和比较规则,可使用以上的变量值进行查看(前提是使用USE语句选择当前默认数据库,若是没有默认数据库,则变量与相应的服务器级系统变量具备相同的值)。
另外,这两个变量是只读的,咱们不能直接修改这两个值就把数据库的字符集和比较规则改变了。这两个值只能经过DDL语句去改变。语法格式为:
CREATE DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称]; ALTER DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];
编辑和修改:
`` CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]]
ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称] ``
编辑和修改:
CREATE TABLE 表名( 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称], 其余列... ); ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
因为字符集和比较规则是互相有联系的,若是咱们只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。,只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。
咱们知道从客户端发往服务器的请求本质上就是一个字符串,服务器向客户端返回的结果本质上也是一个字符串,而字符串实际上是使用某种字符集编码的二进制数据。这个字符串可不是使用一种字符集的编码方式一条道走到黑的,从发送请求到返回结果这个过程当中伴随着屡次字符集的转换,在这个过程当中会用到3个系统变量:
系统变量 | 描述 |
---|---|
character_set_client | 服务器解码请求时使用的字符集 |
character_set_connection | 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection |
character_set_results | 服务器向客户端返回数据时使用的字符集 |
屡次转码流程如上图,注意,若是某个列使用的字符集和character_set_connection表明的字符集不一致的话,还须要进行一次字符集转换。通常状况下要使用保持这三个变量的值和客户端使用的字符集相同,省得没必要要的编解码开销。