zoukankan      html  css  js  c++  java
  • 数据库_9_中文数据问题

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

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

    use mydatabase;
    -- 插入数据(中文)
    insert into my_student values(5,'itcast0005','张越','男');
    

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

      

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

     x指的是十六进制

     报错:服务器没有识别对应的四个字节,服务器认为数据是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连接层是字符集转变的中间者,如果统一了效率更高,不统一也没问题。

    以下操作可以防止乱码:

    如果客户端是gbk,则set names gbk;

    如果客户端是utf8,则是set names utf8;  默认是utf8,不用设置

  • 相关阅读:
    Python—将py文件编译成so文件
    Python—网络通信编程之套接字基本原理
    Python—IO多路复用之epoll总结
    Python—IO多路复用之poll总结
    Python—IO多路复用之select总结
    希尔排序
    直接插入排序
    冒泡排序
    选择排序(C++,Java,Python实现)
    二叉搜索树的相关功能的实现
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9061107.html
Copyright © 2011-2022 走看看