MySQL的字符编码和排序规则
使用过数据库服务的都知道,在创建库的时候,需要对新建的库指定字符集和排序规则,这里以MySQL
为例,如图:
本篇博客就重点讨论一下字符集和排序规则
字符集
说到字符集,先简单的来讲述一下字符、字符集和字符编码这几个词的意义
- 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
- 字符集 (Character set) 是多个字符的集合,字符集种类较多,每个字符集包含的字符个数也不同,常见的字符集如:
ASCII GB2312 GBK UTF-8 Unicode
等,后面会详细讲解 - 字符编码 (英语:Character encoding) 也称字集码,是把字符集中的字符编码为集合中某一对象(例如:比特模式、自然数序列、8位组或电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将阿拉丁字母表编码成
ASCII
。
为了方便理解,这里举一个例子,假如现在洛阳和裴南苇两个人的电脑都使用了各自的编码规则,它们共同的规则如下:
- 都包含字符
徐
、凤
、年
、天
、下
、第
、一
、扶
、墙
、而
、出
- 每个字符只占一个字节(这里是假设哦,实际上一个汉字字符占用并不止一个字节)
其中洛阳的电脑字符集编码如下:裴南苇的电脑字符集编码如下:1
2
3
4
5
6
7
8
9
10
11徐 -> 00000001 -> 0x01(十六进制)
凤 —> 00000010 -> 0x02(十六进制)
年 —> 00000011 -> 0x03(十六进制)
天 —> 00000100 -> 0x04(十六进制)
下 —> 00000101 -> 0x05(十六进制)
第 —> 00000110 -> 0x06(十六进制)
一 —> 00000111 -> 0x07(十六进制)
扶 —> 00001000 -> 0x08(十六进制)
墙 —> 00001001 -> 0x09(十六进制)
而 —> 00001010 -> 0xA(十六进制)
出 —> 00001011 -> 0xB(十六进制)这时候假如洛阳用自己的电脑给裴南苇发送了一条消息:1
2
3
4
5
6
7
8
9
10
11徐 -> 00000001 -> 0x01(十六进制)
凤 —> 00000010 -> 0x02(十六进制)
年 —> 00000011 -> 0x03(十六进制)
扶 —> 00000100 -> 0x04(十六进制)
墙 —> 00000101 -> 0x05(十六进制)
而 —> 00000110 -> 0x06(十六进制)
出 —> 00000111 -> 0x07(十六进制)
天 —> 00001000 -> 0x08(十六进制)
下 —> 00001001 -> 0x09(十六进制)
第 —> 00001010 -> 0xA(十六进制)
一 —> 00001011 -> 0xB(十六进制)这里把字符映射成二进制的过程叫做1
2# 这里为了方便阅读,所以以空格分开了
徐凤年天下第一 -> 00000001 00000010 00000011 00000100 00000101 00000110 00000111 -> 0x010203044050607编码
而裴南苇的电脑收到后用自己的字符编码进行了转码:
1 | 00000001 00000010 00000011 00000100 00000101 00000110 00000111 -> 徐凤年扶墙而出 |
这里把二进制数据映射到字符的过程叫做解码
上面用例子对字符、字符集以及字符编码进行了描述,很显然,两个人由于计算机的编码方式不一样,导致了收到的消息产生了误差(仅仅是为了举例哦,实际上并没有这么简单,没有想到特别好的方式表达)