中文数据问题

中文数据问题

中文数据问题本质是字符集问题

计算机只是别二进制:人类更多是识别符号:需要有个二进制与字符的对应关系(字符集)

客户端向服务端插入中文数据:没有成功

原因:xD5xC5xD4xBD 代表的是 '张悦' 在当前编码(字符集)下对应的二进制编码转换成的十六进制:两个汉字 -->四个字节(GBK)

报错:服务器没有识别对应的四个字节:服务器认为数据是 UTF8,一个汉字有三个字节:读取三个字节转换成汉字(失败),剩余的再度三个字节(并不够):最终失败

所有的数据库服务器认为(表现的)一些特性都是通过服务器端的变量来保存:系统先读取自己的变量,看看应该怎么表现


// 查看服务器到底识别哪些字符集
show character set;

基本上:服务器是万能的,什么字符集都支持
//既然服务器 识别这么多:总有一种是服务器默认的跟客户端打交道的字符集

查看服务器默认的对外处理的字符集
show variables like 'character_set%' ;

问题根源:客户端数据只能是GBK,而服务器认为是utf8:矛盾产生
解决方案:改变服务器,默认的接收字符集为GBK;
set character_set_client =gbk;

插入中文的效果

原因:数据来源是服务器,解析数据是客户端(客户端只识别GBK:只会两个字节一个汉字):
但是事实服务器给的数据却是utf8,三个字节一个汉字:乱码

解决方案:修改服务器给客户端的数据字符集为GBK

set character_set_results =gbk;
set 变量 = 值; 修改只是会话级别(当前客户端,当次连接有效:关闭失效)

设置服务器对客户端的字符集的认识:可以使用快捷方式:set names 字符集
set names gbk; ===>等价于 character_set_client , character_set_result ,character_set_connection

connection连接层:是字符集转变的中间这,如果统一了效率更高,不统一也没问题


校对集问题

校对集:数据比较的方式

校对集有三种格式
_bin:binary二进制比较,取出二进制位,一位一位的比较,区分大小写
_cs:case sensitive,大小写敏感,区分大小写
_ci:case insensitice,大小写不敏感,不区分大小写

查看数据库所支持的校对集: show collation;


校对集应用:只有当数据进行比较时, 校对集才会生效

默认是的utf_general_ci 校对集

对比:使用utf8的_bin 和 _ci来验证 两种不同的校对集效果

1.创建不同的校对集的表


2. 插入数据

 


3. 比较:根据某个字段进行排序:order by 字段名 [asc/desc] ;asc 升序 , desc 降序 默认为升序


校对集:必须在没有数据之前声明好,如果有了数据,那么在进行校对集修改,那么修改无效

web 乱码问题

动态网站有三个部分构成: 浏览器,apache ,服务器(php),数据库服务器,三个部分都有自己的字符集(中文),数据需要在三个部分之间来回传递:很容易产生乱码

如何解决乱码问题:统一编码(三码合一)

但是事实上不可能:浏览器是用户管理(根本不可能控制)
但是必须要解决这些问题:主要靠php来做

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/sunhao96/p/7545740.html