Skip to content

第三章 | 字符集和比较规则

字符集和比较规则

字符集简介

将字符映射成二进制数据的过程叫做编码,将二进制数据映射到字符串的过程叫做解码。

字符集举例

  • ASCII字符集:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于ASCII字符集总共才128个字符,所以使用一个字节来编码。

    'L' —> 01001100

    'M' —> 01001101

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

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

MySQL中支持的字符集和比较规则

utf8mb3: “阉割”过的UTF-8字符集,只是用1~3个字节表示字符

utf8mb4:正宗的UTF-8字符集使用1~4个字节表示字符。

在MySQL中utf8是utf8mb3的别名,如果有使用4字节编码一个字符的情况,如emoji表情请使用utf8mb4。

字符集查看

sql
show [character set | charset];

show charset;
CharsetDescriptionDefault collationMaxlen
armscii8ARMSCII-8 Armenianarmscii8_general_ci1
asciiUS ASCIIascii_general_ci1
big5Big5 Traditional Chinesebig5_chinese_ci2
binaryBinary pseudo charsetbinary1
cp1250Windows Central Europeancp1250_general_ci1
cp1251Windows Cyrilliccp1251_general_ci1
cp1256Windows Arabiccp1256_general_ci1
cp1257Windows Balticcp1257_general_ci1
cp850DOS West Europeancp850_general_ci1
cp852DOS Central Europeancp852_general_ci1
cp866DOS Russiancp866_general_ci1
cp932SJIS for Windows Japanesecp932_japanese_ci2
dec8DEC West Europeandec8_swedish_ci1
eucjpmsUJIS for Windows Japaneseeucjpms_japanese_ci3
euckrEUC-KR Koreaneuckr_korean_ci2
gb18030China National Standard GB18030gb18030_chinese_ci4
gb2312GB2312 Simplified Chinesegb2312_chinese_ci2
gbkGBK Simplified Chinesegbk_chinese_ci2
geostd8GEOSTD8 Georgiangeostd8_general_ci1
greekISO 8859-7 Greekgreek_general_ci1
hebrewISO 8859-8 Hebrewhebrew_general_ci1
hp8HP West Europeanhp8_english_ci1
keybcs2DOS Kamenicky Czech-Slovakkeybcs2_general_ci1
koi8rKOI8-R Relcom Russiankoi8r_general_ci1
koi8uKOI8-U Ukrainiankoi8u_general_ci1
latin1cp1252 West Europeanlatin1_swedish_ci1
latin2ISO 8859-2 Central Europeanlatin2_general_ci1
latin5ISO 8859-9 Turkishlatin5_turkish_ci1
latin7ISO 8859-13 Balticlatin7_general_ci1
macceMac Central Europeanmacce_general_ci1
macromanMac West Europeanmacroman_general_ci1
sjisShift-JIS Japanesesjis_japanese_ci2
swe77bit Swedishswe7_swedish_ci1
tis620TIS620 Thaitis620_thai_ci1
ucs2UCS-2 Unicodeucs2_general_ci2
ujisEUC-JP Japaneseujis_japanese_ci3
utf16UTF-16 Unicodeutf16_general_ci4
utf16leUTF-16LE Unicodeutf16le_general_ci4
utf32UTF-32 Unicodeutf32_general_ci4
utf8UTF-8 Unicodeutf8_general_ci3
utf8mb4UTF-8 Unicodeutf8mb4_0900_ai_ci4

比较规则查看

sql
show collation [like 匹配模式];

show collation like 'utf8\_%';
CollationCharsetIdDefaultCompiledSortlenPad_attribute
utf8_binutf883Yes1PAD SPACE
utf8_croatian_ciutf8213Yes8PAD SPACE
utf8_czech_ciutf8202Yes8PAD SPACE
utf8_danish_ciutf8203Yes8PAD SPACE
utf8_esperanto_ciutf8209Yes8PAD SPACE
utf8_estonian_ciutf8198Yes8PAD SPACE
utf8_general_ciutf833YesYes1PAD SPACE
utf8_general_mysql500_ciutf8223Yes1PAD SPACE
utf8_german2_ciutf8212Yes8PAD SPACE
utf8_hungarian_ciutf8210Yes8PAD SPACE
utf8_icelandic_ciutf8193Yes8PAD SPACE
utf8_latvian_ciutf8194Yes8PAD SPACE
utf8_lithuanian_ciutf8204Yes8PAD SPACE
utf8_persian_ciutf8208Yes8PAD SPACE
utf8_polish_ciutf8197Yes8PAD SPACE
utf8_romanian_ciutf8195Yes8PAD SPACE
utf8_roman_ciutf8207Yes8PAD SPACE
utf8_sinhala_ciutf8211Yes8PAD SPACE
utf8_slovak_ciutf8205Yes8PAD SPACE
utf8_slovenian_ciutf8196Yes8PAD SPACE
utf8_spanish2_ciutf8206Yes8PAD SPACE
utf8_spanish_ciutf8199Yes8PAD SPACE
utf8_swedish_ciutf8200Yes8PAD SPACE
utf8_tolower_ciutf876Yes1PAD SPACE
utf8_turkish_ciutf8201Yes8PAD SPACE
utf8_unicode_520_ciutf8214Yes8PAD SPACE
utf8_unicode_ciutf8192Yes8PAD SPACE
utf8_vietnamese_ciutf8215Yes8PAD SPACE

utf8_general_ci是以ci结尾的,说明不区分大小写

一种字符集可能对应若干比较规则。,且每种字符集都有一种默认的比较规则。default列为YES的比较规则就是该字符集的默认比较规则。

字符集合比较规则的应用

各级别字符集比较规则

  1. 服务器级别

    MySQL提供了两个系统变量来表示服务器级别的字符集和比较规则如下:

    系统变量描述
    character_set_server服务器级别的字符集
    collation_server服务器级别的比较规则

    查看系统变量值

    sql
    SHOW VARIABLES LIKE 'character_set_server';
    Variable_nameValue
    character_set_serverutf8mb4
    SQL
    SHOW VARIABLES LIKE 'collation_server';
    Variable_nameValue
    collation_serverutf8mb4_0900_ai_ci

    服务器级别修改字符集和比较规则可以通过启动项或者在服务器运行程序运行过程中使用SET语句修改这两个变量的值。

    配置文件中修改如下:

    yaml
    [server]
    character_set_server=gb2312
    collation_server=gb2312_chainese_ci
  2. 数据库级别

    在创建数据库是可以指定数据库的字符集和比较规则,语法如下:

    sql
    CREATE TABLE [database name]
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[[DEFAULT] collate 比较规则名称];

    修改字符集和比较规则,语法如下:

    sql
    ALTER TABLE [database name]
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[[DEFAULT] collate 比较规则名称];

    其中DEFAULT可以省略,eg:

    sql
    CREATE DATABASE charset_demo_db
    	CHARACTER SET gb2312
    	COLLATE gb2312_chainese_ci
  3. 表级别

    在创建和修改表的时候指定表的字符集和比较规则,语法如下:

    sql
    -- 创建
    CREATE TABLE 表名(列信息)
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[COLLATE 比较规则名称];
    -- 修改
    ALTER TABLE 表名
    	[[DEFAULT] CHARACTER SET 字符集名称]
    	[COLLATE 比较规则名称];

    eg:

    sql
    USE charset_demo_db;
    CREATE TABLE t(col varchar(10)) CHARACTER SET utf8 COLLATE utf8_general_ci;

    建表时如果没有指定字符集和比较规则则继承表所属数据库字符集和比较规则。

  4. 列级别

    在创建和修改列的时候可以指定该列的字符集和比较规则,语法如下:

    sql
    -- 创建
    CREATE TABLE 表名(
    	列名 字符串类型[CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
        其他列...
    );
    -- 修改
    ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

    eg:

    sql
    ALTER TABLE t MODIFY col VARCHAR(10) CHARACTER SET gbk COLLATE gbk_chinese_ci;
  5. 仅修改字符集或仅修改比较规则

    由于字符集和比较规则之间相互关联,因此只修改字符集,比较规则也会跟着变化,如果只修改比较规则字符集也会跟着变化。

    只修改字符集,比较规则则会变化为修改后字符集的默认比较规则。

    只修改比较规则,字符集则会变为修改后的比较规则对应的字符集。

客户端和服务器通信过程中使用的字符集