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的方式讀出來就成亂碼了

+-------------------------------------------+

Tags: