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的方式读出来就成乱码了

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

时间: 2024-12-16 11:30:23

MySQL的字符集和字符编码笔记的相关文章

【转载】十分钟搞清字符集和字符编码

十分钟搞清字符集和字符编码 什么是字符集 什么是字符编码 UTF-8和Unicode的关系 UTF-8编码简介 为什么会出现乱码 如何识别乱码的本来想要表达的文字 常见问题处理之Emoji 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难.本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能

(转)十分钟搞清字符集和字符编码

十分钟搞清字符集和字符编码 转载自: http://cenalulu.github.io/linux/character-encoding/作者: 卢钧轶 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难. 本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题. 在正式

12.30 字符集和字符编码(Charset & Encoding)(转载)

——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"б?ЯАзЪСЯ"."?????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码 2.1. ASCII字符

字符集和字符编码

1. 概述 现在的编程语言对字符串的处理一般封装比较好,所以平时编写代码,很少要自己考虑字符编码问题.以前学习xml时,由于xml的存储涉及到编码格式,查过一些资料,知道一些概念,GB2312.Unicode.Utf-8.Utf-16.UCS-2等,但这些概念之间什么关系,仍然一知半解.最近要做国际化,需要把不支持Unicode的程序升级为Unicode,借着这个机会,把其中的知识梳理了一遍,对字符编码的理解算更系统化了,在此总结一下. 2. 字符集和字符编码 首先明确两个概念,"字符集&quo

字符集和字符编码(Charset & Encoding)

相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"б?ЯАзЪСЯ"."?????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码 2.1. ASCII字符集&编码 2.2. GBXXXX字符集&编码 2.3. BI

转:字符集和字符编码(Charset & Encoding)

转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"б?ЯАзЪСЯ"."?????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-L

我对字符集和字符编码的理解

先定义两个概念. 字符集 字符集就是把字符和一串数字(码点)一一对应起来.GB2312,GBK,UNICODE,这些都是字符集. 字符编码 字符编码就是取得字符集中和字符对应的那串数字(字符编码)之后,基于取得的那串数字再生成另外一串数字.utf8,utf16,utf32这些都是字符编码. 字符集和字符编码的关系 我们可以把字符集看作一个函数,F(字符)=string1 我们也可以把字符编码看作另外一个函数,G(F(字符))=string2 string1即可以等于string2,也可以不等.

字符乱码之字符集和字符编码

最近经常会碰到上传客户提供的历史数据上传时csv文件用Excel打开时会有乱码问题,虽然知道知道是字符编码不一致导致的,但其中诸多细节却知之甚少,今日特来理理. 1.为什么会有字符乱码问题?如何解决字符乱码问题 计算机中存储的信息都是二进制数表示的,但是世界上有各种不同的语言文字,所以我们需要一些规则将各种字符转换成二进制后存储在计算机中 即编码,以及如果将存储在计算机中的二进制数解析出来即解码.就如破译电报密码一样如果密码本是错误的,那么密码也是错误.会有字符乱码问题就是因为解码方式是不对的,

字符集和字符编码的区别

转自:https://www.cnblogs.com/xdyixia/p/9114145.html 1.字符,字符集,字符编码概念 字符:在计算机和电信技术中,一个字符是一个单位的字形.类字形单位或符号的基本信息.即一个字符可以是一个中文汉字.一个英文字母.一个阿拉伯数字.一个标点符号等. 字符集:多个字符的集合.例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号.序号.数字.拉丁字母.日文假名.希腊字母.俄文字母.汉语拼音符号.汉语注音字母,共 7

十分钟搞清字符集和字符编码

本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧. 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难.本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题.在正式介绍之前,先做个小申明:如果你希望非常精确的理解各个名词的解释,那么可以查阅wikipedia.本文是博主通过自己理解消化后并转化成易懂浅显的表述后的介绍.