字符集与字符编码
一 概念
字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集(中文)、BIG5字符集、 GB18030字符集(中文)、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
字符编码
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
二 关系
字符集是书写系统字母与符号的集合,而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型)),因此基本上可以将两者视为同义词。
三 常用字符编码对比
mysql(utf8、GBK、utf8mb4)
1 存储大小
utf8 使用1-4字节编码。
- US-ASCIl字符1字节,
- 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF),
- 中日韩等东亚字符用3字节,
- 其他极少用4字节。
GBK 都是双字节
utf8mb4 作为utf8的超集,支持4字节的emoji表情。其他一样。
排序规则Collation(collate)
用来为字符串排序
以utf-8为例,
- _ci,case insensitive,不区分大小写,如utf8_genera_ci
- _cs,case sensitive,区分大小写,如utf8_general_cs
- 还有一种是以二进制方式存储,区分大小写,如utf8_bin
大部分情况下字符串可以不区分大小写,但是有些场景需要区分:
- 需要对字符串进行比较,那就应该区分大小写,如密码