且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-03-26 10:48:45

比较初级,

深入的请参考卢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的方式读出来就成乱码了

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











本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/1928024,如需转载请自行联系原作者