《如何理解MySQL里的字符集和校对规则?》我们已经知道了MySQL的字符集和校对规则,现在我将主要介绍查看字符集和校对规则的几种方法。

像这样:

SHOW CHARACTER set \G

我们能查看到所有字符集:

mysql> SHOW CHARACTER set \G
*************************** 1. row ***************************
          Charset: armscii8
      Description: ARMSCII-8 Armenian
Default collation: armscii8_general_ci
           Maxlen: 1
*************************** 2. row ***************************
          Charset: ascii
      Description: US ASCII
Default collation: ascii_general_ci
           Maxlen: 1
*************************** 3. row ***************************
          Charset: big5
      Description: Big5 Traditional Chinese
Default collation: big5_chinese_ci
······

每个字符集都有(Charset)字符集名称、(Description)字符集描述、(Default collation)字符集的默认校对规则、(Maxlen)字符集中一个字符占用的最大字节数。

这几种字符集最为常用:

编码标准核心定位与用途关键技术特点字符覆盖范围兼容性与地位
ASCII主要用于显示现代英语和部分西欧语言采用 7 位二进制编码,共 128 个字符包含控制字符(如回车、退格)及可打印字符(英文、数字、标点)是基础编码标准,后续多数编码兼容 ASCII
GB2312中国国家标准汉字编码字符集兼容 ASCII 编码,采用双字节表示汉字(与后续字节组合)覆盖 99.75% 常用汉字中国早期主流中文编码,为后续中文编码奠定基础
Unicode国际通用的字符集标准支持全球多种语言及符号,需通过具体编码方案实现存储涵盖全球多种语言、符号等海量字符确立全球字符统一标识体系,为跨语言处理提供基础
GBK扩展的汉字编码标准兼容 GB2312 编码,通过调整编码空间实现扩展包含约 20000 个汉字解决 GB2312 生僻字不足问题,是中文编码的重要扩展
UTF-8Unicode 的编码实现方案变长编码(1-4 个字节表示字符),兼容 ASCII支持 Unicode 涵盖的所有字符互联网应用主流编码方式,兼顾兼容性与全球字符支持

那么如何查看MySQL所支持的字符集呢,我们一般会在默认数据库information_schema下查询character_set表(字符集的总览):


USE information_schema;
SELECT * FROM character_sets \G

得到:

MySQL支持的字符集

······

此外,我们还可以同过COLLATIONS表(字符集下属的具体排序规则明细)进行查询( SELECT * FROM COLLATIONS; ),内容大差不差,就不必展示了。

如何查询单个字符集校对规则呢?

可以输入 SHOW COLLATION LIKE '   %'

比如查看utf8mb3:

SHOW COLLATION  LIKE 'utf8mb3%';

查询utf8mb3得到的部分结果

······

展示了utf8mb3字符集的部分校对规则,其中分两个后缀,'_bin'、'_ci',区别如下:

binBinary (二进制)直接比较字符的二进制编码值(如 ASCII/UTF-8 编码的数值)严格区分大小写、区分重音
ciCase-Insensitive (不区分大小写)基于字符的语义(语言规则) 比较,会先将字符统一转为大写 / 小写再比较不区分大小写,部分ci排序规则也不区分重音(需看具体规则,如utf8mb3_general_ci不区分重音)

由于前数据库的默认字符集是 gbk,所以我们就展示在gbk_chinese_cigbk_bin两种不同的排序规则下,我们看看'A'和'a'是否相同,同1否0:

用到的语法是:

CASE WHEN ... THEN ... ELSE ... END

when真返回then,否则返回else,end表示判断结束,以变量case_insensitive_result(是否区分大小写的结果)最为输出结果。

先看看gbk_chinese_ci下的情况:

SELECT CASE
  WHEN 'A' COLLATE gbk_chinese_ci = 'a' COLLATE gbk_chinese_ci
  THEN 1
  ELSE 0
END AS case_insensitive_result;

结果是:

不区分大小写

再看看gbk_bin下的情况:

SELECT CASE
  WHEN 'A' COLLATE gbk_bin = 'a' COLLATE gbk_bin
  THEN 1
  ELSE 0
END AS case_insensitive_result;

结果如下:

严格区分大小写

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)