MySQL的字符集和字符编码笔记
2017-05-22 00:43
246 查看
比较初级,
深入的请参考卢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的方式读出来就成乱码了+-------------------------------------------+
深入的请参考卢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的方式读出来就成乱码了+-------------------------------------------+
相关文章推荐
- MySQL学习笔记 - 字符编码
- 数据字符集mysql主从数据库,分库分表等笔记
- Mycat学习笔记 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。
- 字符,字符编码,字符集,mysql字符
- MySQL自学笔记5--表联合、表连接、视图、字符集、校对集
- mysql 字符集设置(我的笔记之一)
- MySQL--字符编码和字符集
- mysql修改数据库编码(数据库字符集)和表的字符编码的方法
- 服务器架设笔记——httpd插件支持mysql字符集选择
- 61.笔记 MySQL学习——字符串类型与字符集
- MySQL学习笔记——字符集
- 转:字符集和字符编码学习笔记
- 【mysql表字段属性和数据库字符集】学习笔记
- Linux学习笔记:MySQL字符集
- MySQL学习笔记(7)之字符集和校对规则
- mysql笔记 四 左连接 视图 字符集
- 查看和设置MySQL数据库字符集(转) (默认情况下,mysql的字符集是latin1(ISO_8859_1)(注:MySQL5.6不能用此方法修改字符编码)
- MySQL学习笔记四:字符集
- (开发笔记)转载:MySQL设置字符集为UTF8(Windows版)
- 62.笔记 MySQL学习——字符集相关的系统变量