常用的字符集

  • ASCII字符集:共收入128个字符,所以用一个字节来进行编码。 2^7 = 128 < 256
  • ISO 8859-1:收录256个字符 别名Latin1
  • GB2312:汉字为主,汉字6763个,其他文字符号682个同时兼容ASCII,该字符在ASCII字符集中采用一字节编码,否则采用两字节编码。

这是变长编码的方式 “爱u” '爱'采用2字节编码 十六进制为0xB0AE;'u'用1字节编码 十六进制为0x75,合并起来为0xB0AE75

如何判断是单个字符? 某个字节的最高位为0,那么代表单个字符。
  • GBK字符集:拓展GB2312字符集
  • UTF-8:收集很全,兼容ASCII 变长编码,1-4个字节存储
UTF-8只是Unicode的一种方案 还有UTF-16、UTF-32

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

  • utf8mb3: 阉割过的UTF-8字符集 使用1-3字节表示字符
  • utf8mb4: 正宗的UTF-8字符集,1-4字节

MySQL中uft8是指uft8mb3,如果需要4字节编码的比如emoji表情,需要使用utf8mb4

MySQL8 优化了utf8mb4字符集的性能,设置为默认的字符集
# 查看当前MySQL中支持的字符集
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW CHARSET;
# 查看MySQL中支持的比较规则
SHOW COLLATION [LIKE 匹配的模式];
SHOW COLLATION LIKE 'utf8\_%';

mysql8的字符集如下

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

比较规则的后缀意义

_ai不区分重音(accent insensitive)
_as区分重音(accent sensitive)
_ci不区分大小写(case insensitive)
_cs区分大小写(case sensitive)
_bin以二进制方式比较(binary)

比如utf8_general_ci这个比较规则是以ci结尾的,说明不区分大小写
每种字符集都有一种默认的比较规则,SHOW COLLATION的返回结果中的Default列的值为YES的就是该字符集的默认比较规则,比方说utf8字符集默认的比较规则就是utf8_general_ci。

字符集和比较规则的应用

mysql有四个级别的字符集与比较规则,分别为服务器级别、数据库级别、表级别、列级别。

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

    创建和修改数据库时可以指定字符集和⽐较规则:
    CREATE  DATABASE    数据库名
          [[DEFAULT]  CHARACTER   SET 字符集名称]
          [[DEFAULT]  COLLATE ⽐较规则名称];
    ALTER   DATABASE    数据库名
          [[DEFAULT]  CHARACTER   SET 字符集名称]
          [[DEFAULT]  COLLATE ⽐较规则名称];
    例如:
    CREATE DATABASE poo
    CHARARTER SET utf8mb4
    COLLATE utf8mb4_general_ci;
    系统变量描述
    character_set_database数据库级别的字符集
    collation_database数据库级别的比较规则
  • 表级别
创建和修改表的时候指定表的字符集和⽐较规则:
CREATE  TABLE   表名  (列的信息)
        [[DEFAULT]  CHARACTER   SET 字符集名称]
        [COLLATE    ⽐较规则名称]];
ALTER   TABLE   表名
        [[DEFAULT]  CHARACTER   SET 字符集名称]
        [COLLATE    ⽐较规则名称];
例如:
CREATE TABLE danone_events (
 open_id varchar(20)
)CHARARTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 列级别
创建和修改列定义的时候可以指定该列的字符集和⽐较规则:
CREATE  TABLE   表名(列名 字符串类型 
                [CHARACTER  SET 字符集名称]        
                [COLLATE    ⽐较规则名称],
        其他列...
        );
ALTER   TABLE   表名  MODIFY  列名 字符串类型    [CHARACTER  SET 字符集名称]  [COLLATE    ⽐较规则名称];
  • 仅修改字符集或进修改比较规则
    由于字符集与比较规则相互关联,因此修改任意一个,另外一个都会相应跟着变化。具体规则如下:

    • 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则;
    • 只修改比较规则,则字符集将变为修改后的比较规则默认的字符集;
  • 个级别字符集和比较规则小结
  • 如果创建或者修改列时没有用显示指定字符集和比较规则,则该列默认使用表的字符集和比较规则。
最后修改:2022 年 04 月 09 日
如果觉得我的文章对你有用,请随意赞赏