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最大的商品,要求 ...
随机推荐
- 流行-Manifold学习理解与应用
流行-Manifold[1] 流形,也就是 Manifold . 1. 比较好的形象理解 流形学习的观点是认为,我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的,即这些数据所在的空间是“ ...
- Mudos扩展efunc,packages方式
Mudos扩展efunc,packages方式 首先packages目录建好C文件 我们这里测试了一个mongodb的 mongodb_spec.c mongodb.h mongodb.c 这里具体的 ...
- HUSTOJ搭建后为了方便作为Judger调用进行的一些修改操作
这里的操作主要包括: 找到初始的MySQL数据库用户名和密码: 将 csrf 设置为固定值: 取消掉同一用户相邻提交时间间隔需要10秒钟的限制. 内容如下: 系统:ubuntu18.04.2 hust ...
- Deploy != Release(第一部分):部署与发布的区别,以及为什么这很重要
原文地址:http://ju.outofmemory.cn/entry/351873 翻译自: Deploy != Release (Part 1): The difference between d ...
- 【神经网络与深度学习】【计算机视觉】SSD
SSD 转自:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote 参考: SSD: Single Shot MultiBox Detec ...
- odoo 流水码 编码规则
<?xml version="1.0" encoding="utf-8"?> <odoo> <data noupdate=&quo ...
- TestNG执行顺序控制
1.class执行顺序控制---testng.xml之preserve-order preserve-order:用来控制<test>里面所有<classes>的执行顺序.&l ...
- Linux学习-防火墙-Selinux-配置本地YUM源
关闭防火墙并设置开机不启动 systemctl status firewalld.service #查看firewalld状态systemctl stop firewalld #关闭systemctl ...
- android 8.0 以后 uiautomator 无法直接使用的问题
android8.1以后sdk tools自带的uiautomator直接打开,截取不到机器界面信息. 可以使用以下方法手动截取. 首先操作机器定位到要分析的界面. 1.截取uix资源文件 adb s ...
- 在window10安装Mysql
一:下载 1.1下载地址:https://dev.mysql.com/downloads/mysql/ 1.2解压 D:\InstallSoftWare\MYSQL 2环境变量配置 path里添 ...