MySql(二)——字符集和比较规则

MySql(二)——字符集和比较规则

一些重要的字符集

  1. ASCIIsql

    • 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。因为总共才128个字符,因此可使用1个字节来进行编码
  2. ISO 8859-1数据库

    • 共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧经常使用字符(包括德法两国的字母),也可使用1个字节来进行编码。这个字符集也有一个别名latin1
  3. GB2312服务器

    • 收录汉字6763个,其余文字符号682个。同时这种字符集又兼容ASCII字符集
    • 若是该字符在ASCII字符集中,则采用1字节编码,不然采用2字节编码
    • 这种表示一个字符须要的字节数可能不一样的编码方式称为:变长编码方式
  4. GBK编码

    • 在收录字符范围上对GB2312字符集做了扩充,编码方式上兼容GB2312
  5. utf8code

    • 收录地球上能想到的全部字符,并且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符须要使用1~4个字节
utf8只是Unicode字符集的一种编码方案, Unicode字符集能够采用 utf8utf16utf32这几种编码方案, utf8使用1~4个字节编码一个字符, utf16使用2个或4个字节编码一个字符, utf32使用4个字节编码一个字符。

MySQL中支持的字符集和排序规则

MySQL中的utf8和utf8mb4server

  • utf8mb3:阉割过的utf8字符集,只使用1~3个字节表示字符
  • utf8mb4:正宗的utf8字符集,使用1~4个字节表示字符
在MySQL中 utf8utf8mb3的别名

字符集的查看
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式]排序

比较规则的查看
SHOW COLLATION [LIKE 匹配的模式]ci

后缀 英文释义 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较

字符集和比较规则的应用

1. MySQL有4个级别的字符集和比较规则字符串

  1. 服务器级别
  2. 数据库级别
  3. 表级别
  4. 列级别

2. 服务器级别it

  • 服务器级别的字符集:SHOW VARIABLES LIKE 'character_set_server'
  • 服务器级别的比较规则:SHOW VARIABLES LIKE 'collation_server'
  • 写入配置文件:
[server]
character_set_server=utf8
collation_server=utf8_general_ci

3. 数据库级别

  • 当前数据库的字符集:SHOW VARIABLES LIKE 'character_set_database'
  • 当前数据库的比较规则:SHOW VARIABLES LIKE 'collation_database'
  • 建立和修改数据库的时候数据库的字符集和比较规则
CREATE DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];

ALTER DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];
建立数据库不指定字符集和比较规则,则默认使用服务器级别的字符集和比较规则

4. 表级别

CREATE TABLE 表名 (列的信息)
    [[DEFAULT] CHARACTER SET 字符集名称]
    [COLLATE 比较规则名称]]

ALTER TABLE 表名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [COLLATE 比较规则名称]
若是建立和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则做为该表的字符集和比较规则

5.列级别

CREATE TABLE 表名(
    列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
    其余列...
);

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
对于某个列来讲,若是在建立和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则做为该列的字符集和比较规则

6.仅修改字符集或仅修改比较规则

  • 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则
  • 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集

7.各级别字符集和比较规则小结

  • 若是建立或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
  • 若是建立或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
  • 若是建立或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

客户端和服务器通讯中的字符集

从发送请求到返回结果这个过程当中伴随着屡次字符集的转换,在这个过程当中会用到3个系统变量
系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器运行过程当中使用的字符集
character_set_results 服务器向客户端返回数据时使用的字符集
  • 服务器认为客户端发送过来的请求是用character_set_client编码的
  • 服务器将把获得的结果集使用character_set_results编码后发送给客户端
  • character_set_connection只是服务器在处理请求时使用的字符集,它是什么其实没多重要,可是必定要注意,该字符集包含的字符范围必定涵盖请求以及结果集中的字符,要否则会出现没法将请求中的字符编码成character_set_connection字符集或者没法编码结果集中的字符

SET NAMES 字符集名等价于:

  1. SET character_set_client = 字符集名;
  2. SET character_set_connection = 字符集名;
  3. SET character_set_results = 字符集名;

若是想写进配置文件:

[client]
default-character-set=utf8
相关文章
相关标签/搜索