mysql学习之基础篇08 UTF8编码
这次我们来说一下在Mysql中的编码问题:
我们知道应用于计算机的最早的字符集是ASCII,它所组成的编码是ASCII编码;由于对于其他国家来说它所容纳的字符个数比较少,后来就出现了ANSI字符集,它的编码就是本地编码,由于各个国家的本地编码不相同,导致互相不兼容,最后就出现了Unicode字符集,它规定全世界通用一张码表,用4个字节来编号,但是我们常用的字符集中在前65535个编号里,用两个字节就够了,那么我们就可以简化编码,比如:
unicode用0000 0000 0000 0000 0000 0000 000 0041表示A
而我们可以用0000 0041来表示A
把高位浪费的0值,按照一定的规则舍弃掉,这样形成的编码方式是UTF方式,而最著名的就是UTF-8编码方式。
简单的形容Unicode与UTF-8 的关系:就像是原文件--->压缩文件 的关系。UTF-8是一种变长的编码方式,它编码时所占的字节如下图所示:

而GBK则是中国汉字的一套编码方式
那么乱码是如何形成的?
主要有两点
- 解码时与实际编码不一致(可修复)
- 传输过程中,编码不一致,导致字节丢失(不可修复)
连接器的特性: 连接客户端与服务器
客户端的字符先发给连接器,连接器选择一种编码将其转换,临时存储,然后再次转换成服务器需要的编码,并存储在服务器里。
要想不乱码,需要指定客户端的编码,让连接器不理解错误,这样就不会存入错误数据,往回取的时候,我们还要告诉连接器,如果你从服务器返回,应该返回什么格式的编码。
一共是三个参数,客户端的发送的编码,连接器使用的编码,获取的返回数据的编码。
举个例子:
当前的请况是,客户端GBK,服务器最终存UTF8
我明确的告诉服务器:我的客户端是GBK的:
Set character_set_client=gbk;

再告诉连接器,使用UTF8:
Set character_set_connection=utf8;

再告诉,如果返回值,请返回GBK的结果:
Set character_set_results=gbk;

如果我偏要对方给我返回的数据是UTF8:
Set character_set_results=utf8;

我们可以看到出现了乱码,但是这些乱码都是可以修复的
再来看另一种情况:
我先声明客户端,连接器,服务器都是gbk格式:

我们插入一条数据,然后显示它:

可以看出没有乱码;
我们再把连接器的编码改成latin1:
Set character_set_client=latin1;

然后我们插入数据:

然后我们再显示它:

可以看到出现了乱码,而且这种乱码是不可修复的,latin1小,gbk大,就像大鱼过小鱼网,丢了块肉。
因此要想不乱码,必须使服务器>=连接器>=客户端
如果3者都是gbk,那么就可以简写成set names gbk;
我们打开记事本,先输入一个“联通”,然后把它保存起来并关闭:

然后我们再次打开它

我们会发现它变成了乱码。
其实这是因为记事本在打开的时候,它也不知道你用的是什么编码,它是靠分析编码的特点来推测的,如果字节比较少,就容易推测错。
推荐链接:https://www.bilibili.com/video/av19538278/?p=41
mysql学习之基础篇08 UTF8编码的更多相关文章
- python 学习之 基础篇二 字符编码
声明: 博文参考1:字符编码发展历程(ASCII,Unicode,UTF-8) 博文参考2:Python常见字符编码间的转换 (1)为什么要用字符编码 早期的计算机使用的是通电与否的特性的真空管,如果 ...
- mysql学习之基础篇01
大概在一周前看了燕十八老师讲解的mysql数据库视频,也跟着学了一周,我就想把我这一周所学的知识跟大家分享一下:因为是第一次写博客,所以可能会写的很烂,请大家多多包涵.文章中有不对的地方还请大家指出来 ...
- mysql学习之基础篇03
我们今天来进行建表的基本操作: 首先要建表就要了解列类型,因为建表就是声明列的过程,列声明完成了,表也就建好了. mysql中列分为三大类: 一.数值型 数值型又分为整型和浮点型两种. 先来看整型: ...
- mysql学习之基础篇07
视图:view 在查询的时候我们经常把查询到的结果当成一张临时表来看,其实view就可以看成一张虚拟表,是表通过某种运算得到的投影 那么如何创建视图?创建视图需要指定视图的列名和列类型吗? 答:不用, ...
- mysql学习之基础篇05
mysql中的统计函数: 1. 查询商品价格中最高的价格: select max(shop_price) from goods; 2. 查询商品价格中最低的价格: select min(shop_pr ...
- mysql学习之基础篇04
五种基本子句查询 查询是mysql中最重要的一环,我们今天就来说一下select的五种子句中的where条件查询: 首先我们先建立一张商品表:goods 由于商品数目太多,我就不一一列举了. 在这里我 ...
- mysql学习之基础篇02
我们来说一下表的增删改查的基本语法: 首先建立一个简单的薪资表: create table salary(id int primary key auto_increment,sname varchar ...
- MySQL学习之基础篇09-事务
我们在建表的时候通常会在最后声明引擎类型,这次我们就来看看存储引擎都有哪些: 举个例子: --------------------------- 银行转账: 张三想给李四转500元钱: 张三-500 ...
- mysql学习之基础篇06
子查询:又分为where型子查询,from型子查询,exists型子查询这三类. where型子查询:指把内层查询的结果作为外层查询的比较条件: 举个例子: 我们想查出goods_id最大的商品,要求 ...
随机推荐
- nfs高可用
一.简介 NFS是单点的,如果一个节点出现问题,那使用它挂载服务的都将出现问题.所以需要高可用,挂掉一台不影响.采用keepalived+rsync+inotify-tools 环境: ubunt ...
- SQL多个逗号分开的字段值 取对应的数据名称信息
字段值 函数实现: )) ) as begin set @strs=','+@strs+',' ) ) set @str2='' declare SyncOrderCursor cursor for ...
- PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习
1086 Tree Traversals Again (25分) An inorder binary tree traversal can be implemented in a non-recu ...
- Java获取执行进程的dump文件及获取Java stack
转发自https://blog.csdn.net/MCC_MCC_MCC/article/details/80623156 1.Windows/Linux环境下查看Java进程ID方法 使用Java自 ...
- php利用crontab执行 5分钟发邮件给用户 (包含每分钟发一次)
php利用crontab执行 5分钟发邮件给用户 一开始设想用shell_exec执行sh 运行 crontab但发现并不可取 因为没办法传变量 (因为要传963529987@qq.com)所以决定采 ...
- A+B for Polynomials
This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...
- QT/C++ 类型转换
"轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩"------阿魔 1) int转为QString: QString::number(int) 2) std::stri ...
- Office系列常用快捷键
office三件套,常用的快捷键. Word常用快捷键 查找文字.格式和特殊项 Ctrl+G 使字符变为粗体 Ctrl+B 为字符添加下划线 Ctrl+U 删除段落格式 Ctrl+Q 复制所选文本或对 ...
- java接入微信JS-SDK
在微信公众号开发中不可,jssdk的接入虽然不是必须,但是根据业务需求我们还是可能用到,下面是自己整理的关于java接入的jssdk的方法,这里是记录关于接入微信JS-SDK的准备工作,关于接入JS- ...
- makefile从0到1
一.什么是makefile 百度百科:Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员.在 Linux(u ...