常用的字符集
- 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的字符集如下
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 |
utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
比较规则的后缀意义
_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 ⽐较规则名称];
仅修改字符集或进修改比较规则
由于字符集与比较规则相互关联,因此修改任意一个,另外一个都会相应跟着变化。具体规则如下:- 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则;
- 只修改比较规则,则字符集将变为修改后的比较规则默认的字符集;
- 个级别字符集和比较规则小结
- 如果创建或者修改列时没有用显示指定字符集和比较规则,则该列默认使用表的字符集和比较规则。