MySQL的字符编码和排序规则

MySQL

使用过数据库服务的都知道,在创建库的时候,需要对新建的库指定字符集和排序规则,这里以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 -> 徐凤年扶墙而出

这里把二进制数据映射到字符的过程叫做解码
上面用例子对字符、字符集以及字符编码进行了描述,很显然,两个人由于计算机的编码方式不一样,导致了收到的消息产生了误差(仅仅是为了举例哦,实际上并没有这么简单,没有想到特别好的方式表达)