在《如何理解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-8 | Unicode 的编码实现方案 | 变长编码(1-4 个字节表示字符),兼容 ASCII | 支持 Unicode 涵盖的所有字符 | 互联网应用主流编码方式,兼顾兼容性与全球字符支持 |
那么如何查看MySQL所支持的字符集呢,我们一般会在默认数据库information_schema下查询character_set表(字符集的总览):
USE information_schema; SELECT * FROM character_sets \G
得到:
······
此外,我们还可以同过COLLATIONS表(字符集下属的具体排序规则明细)进行查询( SELECT * FROM COLLATIONS; ),内容大差不差,就不必展示了。
如何查询单个字符集校对规则呢?
可以输入 SHOW COLLATION LIKE ' %':
比如查看utf8mb3:
SHOW COLLATION LIKE 'utf8mb3%';
······
展示了utf8mb3字符集的部分校对规则,其中分两个后缀,'_bin'、'_ci',区别如下:
bin | Binary (二进制) | 直接比较字符的二进制编码值(如 ASCII/UTF-8 编码的数值) | 严格区分大小写、区分重音 |
ci | Case-Insensitive (不区分大小写) | 基于字符的语义(语言规则) 比较,会先将字符统一转为大写 / 小写再比较 | 不区分大小写,部分ci 排序规则也不区分重音(需看具体规则,如utf8mb3_general_ci 不区分重音) |
由于前数据库的默认字符集是 gbk,所以我们就展示在gbk_chinese_ci和gbk_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;
结果如下:
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程