立即学习:https://edu.csdn.net/course/play/2300/35869?utm_source=blogtoedu
# 中文数据问题
中文数据问题本质是字符集问题。
计算机只识别二进制,人类更多是识别符号,需要有个二进制与字符的对应关系(字符集)
-- 插入数据(中文)
insert into my_student values(5,'005','张越','男');
客户端向服务器插入中文数据,没有成功。
原因:汉字在当前编码(字符集)下对应的二进制编码换成的十六进制:两个汉字=》四字节(GBK)
报错:服务器没有识别对应的四个字节:服务器认为数据是UTF8,一个汉字有三个字节,读取三个字节转换成汉字(失败),剩余的再读三个字节(不够),最终失败。
所有的数据库服务器表现的一些特性都是通过服务器的变量来保存:系统先读取自己的变量,看看应该怎么表现。
//查看服务器到底识别哪些字符集
show character set;
基本上:服务器是万能,什么字符集都能支持。
//既然服务器识别那么多,总有一种是服务器默认的跟客户端打交道的字符集。
-- 查看服务器默认的对外处理的字符集
show variables like 'character_set%';
问题根源:客户端数据只能是GBK,而服务器认为是UTF,矛盾产生。
解决方案:改变服务器,默认的接收字符集为GBK;
Set character_set_client = gbk;
-- 修改服务器认为的客户端数据的字符集为GBK
Set character_set_client = gbk;
如果显示表数据,发现中文乱码,这样的原因是:数据来源是服务器,解析数据是客户端(客户端只识别GBK:智慧两个字节一个汉字),但是事实服务器给的数据确实UTF8,三个字节ig汉字->乱码
解决方式:修改服务器给定数据的字符集为GBK
set character_set_result = gbk;
Set 变量 = 值;修改只是会话级别(当前客户端,当西连接有效,关闭失效)
设置服务器对客户端的字符集的认识:可以使用快捷方式:set names 字符集
Set names gbk; ==> character_set_client,character_set_result,character_set_connection
Connection连接层:是字符集转变的中间者,如果统一了效率更高,不同意也没问题。