1. 程式人生 > >MySQL的字符集和字符編碼筆記

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

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 |

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

GBK字符集是按照4個長度來分割的,因此得出對應關系:

你 --> 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 |

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



如下例子:

創建2張表t1、t2

> create table t1 (a varchar(40)) charset=gbk;

> set names gbk;

> insert into t1 select ‘你好‘;

> SELECT hex(convert(‘你好‘ using gbk)); ---> GBK格式下,實際上底層存儲是C4E3BAC3

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

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

|----------------------------------|

| C4E3BAC3 |

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

> create table t2 (a varchar(40)) charset=utf8;

> set names utf8;

> insert into t2 select ‘你好‘;

> SELECT hex(convert(‘你好‘ using utf8)); ---> UTF8格式下,實際上底層存儲是E4BDA0E5A5BD

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

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

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

| E4BDA0E5A5BD |

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

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

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


本文出自 “菜雞” 博客,請務必保留此出處http://lee90.blog.51cto.com/10414478/1928024

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