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

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

一些重要的字符集

  1. ASCII

    • 共收录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. utf8

    • 收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节

utf8只是Unicode字符集的一种编码方案,
Unicode字符集可以采用
utf8
utf16
utf32这几种编码方案,
utf8使用1~4个字节编码一个字符,
utf16使用2个或4个字节编码一个字符,
utf32使用4个字节编码一个字符。

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

MySQL中的utf8和utf8mb4

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

在MySQL中
utf8
utf8mb3的别名

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

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

后缀英文释义描述
_aiaccent insensitive不区分重音
_asaccent sensitive区分重音
_cicase insensitive不区分大小写
_cscase sensitive区分大小写
_binbinary以二进制方式比较

字符集和比较规则的应用

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

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

2. 服务器级别

  • 服务器级别的字符集: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
    原文作者:罗纳尔多Coder
    原文地址: https://segmentfault.com/a/1190000018529150
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞