MySQL的字符集和字符编码笔记

  • 2019 年 10 月 5 日
  • 笔记

比较初级,

深入的请参考卢sir的博客:

http://cenalulu.github.io/linux/character-encoding/

http://cenalulu.github.io/mysql/mysql-mojibake/

GBK 和UTF8的实际在系统里面的存放方式:

1、GBK:

> SELECT hex(convert('你好' using gbk));

+———————————-+

| hex(convert('你好' using gbk))   |

|———————————-|

| C4E3BAC3 |

+———————————-+

GBK字符集是按照4个长度来分割的,因此得出对应关系:

你 –> C4E3

好 –> BAC3

2、UTF-8:

> SELECT hex(convert('你好' using utf8));

+———————————–+

| hex(convert('你好' using utf8))   |

|———————————–|

| E4BDA0E5A5BD           |

+———————————–+

UTF8字符集是按照6个长度来分割的,因此得出对应关系:

你 –> E4BDA0

好 –> E5A5BD

这样我们就能发现不同的地方了。假如我们用的是UTF-8存进去的"你好"(对应的底层存储为:E4BDA0E5A5BD),但是使用GBK的方式来读取的话,GBK会对E4BDA0E5A5BD按照每4个bit长度切分,最终切分成E4BD A0E5 A5BD 这个样子。

(如下)

> SELECT CONVERT( unhex('E4BDA0E5A5BD') USING GBK);

+——————————————-+

| CONVERT( unhex('E4BDA0E5A5BD') USING GBK) |

+——————————————-+

| 浣犲ソ                                    |   —> 采用GBK的方式读出来就成乱码了

+——————————————-+

> SELECT hex(convert('浣' using gbk));

+——————————-+

| hex(convert('浣' using gbk)) |

+——————————-+

| E4BD                         |

+——————————-+

> SELECT hex(convert('犲' using gbk));

+——————————-+

| hex(convert('犲' using gbk)) |

+——————————-+

| A0E5                         |

+——————————-+

> SELECT hex(convert('ソ' using gbk));

+——————————-+

| hex(convert('ソ' using gbk)) |

+——————————-+

| A5BD                         |

+——————————-+

补充,将16进制的编码反推成UTF8编码的汉字:

> SELECT CONVERT( unhex('E4BDA0E5A5BD') USING utf8);

+——————————————–+

| CONVERT( unhex('E4BDA0E5A5BD') USING utf8) |

+——————————————–+

| 你好                                       |

+——————————————–+

> SELECT CONVERT( unhex('E4BDA0E5A5BD') USING GBK);

+——————————————-+

| CONVERT( unhex('E4BDA0E5A5BD') USING GBK) |

+——————————————-+

| 浣犲ソ                                    |   —> 采用GBK的方式读出来就成乱码了

+——————————————-+