天天看點

MySQL的字元集和字元編碼筆記

比較初級,

深入的請參考盧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) |

| 你好                                       |

本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/1928024,如需轉載請自行聯系原作者

繼續閱讀