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