1.字符集和排序规则
字符集(character set)是一组符号(symbol)和编码(encoding)。排序规则(collation)是一 组用于比较字符集中的字符的规则。
假设我们有一个包含四个字母的字母表: A
, B
, a
, b
。我们给每个字母一个数字: A
= 0, B
= 1, a
= 2, b
= 3。字母 A
是一个符号,数字 0 代表 A
的 编码,所有四个字母及其编码的组合就是一个 字符集。
假设我们要比较两个字符串值, A
和 B
。最简单的方法是查看编码:0 代表A
和 1 代表B
。因为 0 小于 1,所以我们说 A
小于B
。我们刚刚所做的是将排序规则应用于我们的字符集。排序规则是一组规则(在这种情况下只有一个规则):“比较编码”。我们将所有可能的排序规则中最简单的称为 二进制排序规则。
但是如果我们想说小写字母和大写字母是相等的呢?那么我们至少有两条规则:(1)将小写字母a
和 b
视为等于A
和 B
;(2) 然后比较编码。我们称之为不区分大小写的 排序规则。它比二进制排序规则复杂一点。
在现实生活中,大多数字符集都有许多字符:整个字母表不仅仅是 A
,B
,有时还有多个字母表或具有数千个字符的东方书写系统,以及许多特殊符号和标点符号。同样在现实生活中,大多数排序规则都有很多规则,不仅仅是是否区分字母大小写,还有是否区分重音(Accent)(“重音”是附加在字符上的标记,如德语Ö
),以及多字符映射(例如:在两个德语排序规则之一中Ö
=OE
的规则)。
2.MySQL字符集和排序规则
MySQL默认的字符集是utf8mb4
,排序规则是utf8mb4_0900_ai_ci
。
要显示可用的字符集,请使用SHOW CHARACTER SET
语句。
mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| 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 | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
给定的字符集总是至少有一个排序规则,并且大多数字符集都有几个。要列出字符集的显示排序规则,请使用 SHOW COLLATION
语句。
mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';
3.Unicode 字符集
字符集 | 支持的字符 | 每个字符所需的存储空间 |
---|---|---|
utf8mb3 , utf8 (已弃用) | 仅 BMP | 1、2 或 3 个字节 |
ucs2 (已弃用) | 仅 BMP | 2 个字节 |
utf8mb4 | BMP 和补充 | 1、2、3 或 4 个字节 |
utf16 | BMP 和补充 | 2 或 4 个字节 |
utf16le | BMP 和补充 | 2 或 4 个字节 |
utf32 | BMP 和补充 | 4字节 |
4.排序规则命名约定
排序规则名称以与其关联的字符集的名称开头,通常后跟一个或多个表示其他排序规则特征的后缀。
如果排序规则名称不包含_ai
或_as
,_ci
则隐式包含_ai
,_cs
则隐式包含_as
。
后缀 | 意义 |
---|---|
_ai | Accent-insensitive(重音不敏感) |
_as | Accent-sensitive(重音敏感) |
_ci | Case-insensitive(不区分大小写) |
_cs | Case-sensitive(区分大小写) |
_ks | Kana-sensitive(日文假名敏感) |
_bin | Binary(二进制) |
5.National Character Set
National
前缀表示列应该使用预定义字符集,MySQL使用utf8
作为预定义字符集,而utf8
当前是utf8mb3
的别名,还未切换为utf8mb4
的别名,所以一般不使用National
前缀。
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/sqlexp/15835.html