28、MySQL字符集参数详解

2018-12-17  本文已影响0人  小碧小琳

前言:

需要明确的地方

下面的set names 语句,就是为了避免上述两种乱码情况,而产生的。

一、set names 语句

一般来说,我们建表时总是在最后面加上一句“charset = utf-8”,如下:

使得服务器端的表,存储数据时编码都用utf-8格式(因为utf-8包含很多字符,并且节省存储空间)。

27、GB2312与UTF8编码详解中,我们也讲了出现乱码的两种可能,以及相对应的解决办法(第一种情况转变编码规则即可)。

问:在数据库的日常操作过程中,我们如果遇到了乱码的情况,应该怎么用sql语句解决呢?
答:一般,需要在建表前加入一条sql语句

set names gbk#(或者用utf-8)

怎么理解这句sql呢?

二、三个参数

2.1、连接器的必要性

如下,一般我们进行数据库操作时,客户端(也就是命令行)中用的是GBK的编码格式。

查看命令行属性:

比如,下面的命令行中,“指南针”三个字就是GBK格式的:


在客户端收集到的是GBK编码,而数据库最终想存成utf-8编码,上面也说了,如果直接传入到数据库中,因为编码与解码不对应,会导致乱码。

那么一定会有一个承上启下的“翻译”的“中间人”来保证不会出现乱码的情况。

2.2、传入数据:client与connection的参数编码指定

问:如果按照上面,client端指定是GBK格式,database中默认是utf-8,那么连接器应该是什么格式的呢?
答:要么是GBK,要么是utf-8。

2.2.1、情况1

如果有这种情况:

过程很正常,并没有发生上述问题3 中的情况。

2.2.2、情况二

类似情况一,GBK到utf-8,一样通过连接器执行转换操作,一直到最后存储到数据中。

2.3、传出数据:results的参数编码指定

2.3.1、数据传出

经过上面一节的操作,我们已经完成了数据的存入(假设不存在乱码情况)。

读取数据时,数据从服务器返回到连接器,经过转换以后,在传出到results端以前,我们要明确告诉连接器,results端的显示编码规范是什么才行。

2.3.2举个栗子

1斤===0.5kg==1.101磅。

一个商人到中国收购沙子到美国去卖 -- > 一个数据的存储与返回过程

因此,上面做生意的过程,我们一定要明确每一步中是按照什么价格来算的,如果你按千克卖,他按照斤收,肯定是不合适的。

对应到数据库的字符集问题上,我们一定要明确每一步的字符集都是什么,client是什么,connection是什么,results是什么。这三个参数一定要明确。否则就会乱码了。

比如,明明results端的显示编码规范是latin1,而你告诉连接器results端的显示规范是GBK,那么连接器最终就会输出到GBK编码到results端,results端解读不了就会发生乱码。

注意,从服务器返回来的数据也是显示在命令行中的,因此此时的results显示编码应该与命令行的属性编码一致

2.3、三个参数

2.3.1、遵守规范才能不乱码

综上要想不乱码,有三个参数需要明确的指出:
client,connection,results。

只要让这三个参数之间的转换遵守规范,就不会发生乱码。

问:应该遵守什么样的规范呢?
答:- 1、编码与解码一致

2.3.2、一些例子

2.3.2.1、不乱码

比如,对于客户端是GBK,服务器存储UTF-8的格式

这样就不会乱码。如下:

2.3.2.2、乱码

a、编码与解码规则不一致的情况
例题1:

客户端传入的是GBK,但就是欺骗连接器,我传入的是utf-8格式的。那么连接器就按照utf-8的格式解码传入的数据:
可见设置(第一个红框)之后,转换出错(第二个红框):

例题2:

results端显示格式是GBK,但是非要连接器返回utf-8格式的。解码时GBK,返回的数据编码是utf-8,那么就会乱码。

b、大转小,导致信息丢失,产生乱码
例题3:

客户端设为GBK,连接器设置为latin1,服务器为utf-8。

此时,会因为GBK容量大于latin,在编码转换的时候,导致字节丢失。并且是不可修复的乱码。

因此,应该遵循的原则:
服务器 >= conntion >= client

2.4、set names gbk的意思

经过上面那么多的铺垫,我们应该会理解这句sql的意思了。

如果三个参数(客户端,连接器,返回值)都是GBK,就可以在sql语句中,简写成set names gbk。

三、在网页中的字符集参数设置

3.1、网页中编码与解码的统一

一般,网页中的编码格式与显示的格式都是utf-8的。

如下图,

如果在第一个红框中,设置“charset=GBK”,那么因为编码与解码不同意,网页解码以后,显示出来的结果就是乱码了。

网页乱码情况

3.2、网页与数据库的交互

一般来说,网页是utf-8,服务器表中数据也是utf-8。那么在建立数据库时,也可以在数据库前用set names utf8这条来保证不会发生乱码的情况。

问:旧网页(client)中是GBK格式,旧服务器表中存储的是GBK格式,新网页(results)是utf-8格式,应该怎么设置参数呢?

传递信息的过程:
client传给服务器,服务器
答:同上。(utf-8与GBK之间互相转换,不用过分考虑大转小丢失信息的问题)

上一篇 下一篇

猜你喜欢

热点阅读