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的字符集和字符編碼筆記