关于GreatSQL字符集的总结


关于GreatSQL字符集的总结

前言

最近的SQL优化工作中经常遇到因字符集或校验规则不一致导致索引使用不了的问题,修改表的字符集或校验规则相当于把表重构,表中数据量大时,处理起来费时费力,希望应用开发者在设计之初时注意到此问题,让后期接手运维的小伙伴少一些负担。GreatSQL的字符集和校验规则种类繁多,提供灵活性的同时,也带来使用混乱的烦恼。本文对字符集做一个总结,让读者对GreatSQL的字符集有一个全面的了解。

一、字符集介绍

计算机存储的都是二进制数据,十进制数字可以转换为二进制,那么字符串要转换为二进制数据就需要一个映射关系,字符转换为二进制叫编码,二进制转换为字符叫解码,这个其实就是字符集的概念,描述某个字符范围的编码规则,不同的字符集包含的字符范围不一样。

下面介绍一些重要的字符集。

1. ASCII字符集

共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。不可见字符主要指控制字符(比如换行、回车等)和通信字符(比如文头SOH、文尾EOT等)等。ASCII字符集总共128个字符,可以使用1个字节来进行编码。

2. ISO8859-1字符集

共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母)。ISO8859-1字符集也可以使用1个字节来进行编码。这个字符集还有一个别名Latin1。

3. GB2312字符集

收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。收录汉字6763个,收录其他文字符号682个。这种字符集同时兼容ASCII字符集,所以如果字符在ASCII字符集中则采用1字节编码,否则采用2字节编码。

4. GBK字符集

GBK对GB2312字符集进行了扩充,编码方式兼容GB2312字符集。同GB2312字符集,如果字符在ASCII字符集中则采用一字节编码,否则采用2字节编码。

5. UTF-8字符集

几乎收录了当今世界各个国家地区使用的字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。通常一个汉字是3个字节编码,一个字母是一个字节编码。UTF-8是Unicode的一种编码方案,此外还有UTF-16、UTF-32编码方案。

我们可以看出,ISO8859-1、GB2312、GBK、UTF-8字符集都包含了ASCIIS字符集,GBK包含了GB2312字符集,  UTF-8收录的字符涵盖GBK、GB2312、ISO8859-1的字符,但是它们编码规则是不一样的。

比如汉字“我”的编码方式:

GBK中的编码:1100111011010010

UTF-8的编码:111001101000100010010001

二、GreatSQL字符集与比较规则

1.查看GreatSQL支持的字符集

通过语句show (character set|charset) [like 匹配的模式] 来查看支持的字符集,数据来源于表information_schema.character_sets。

这其中character set与charset 是同义词。

greatsql> show charset; +----------+---------------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | binary | Binary pseudo charset | binary | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | cp866 | DOS Russian | cp866_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | utf8mb3 | UTF-8 Unicode | utf8mb3_general_ci | 3 | | utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 | +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.00 sec)