`
dennisbing
  • 浏览: 160750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MYSQL的字符问题--续<引用>

阅读更多
三个MySQL的系统变量是:
  ①character_set_client,终端字符集,告诉Server客户端提交的SQL语句的编码格式
  ②character_set_connection,连接字符集,是服务器翻译SQL语句时用到的编码格式
  ③character_set_results,返回的结果集的字符集,是服务器返回结果集之前把结果集转换成的编码格式
  在MySQL终端通过执行命令 show variables like 'char%'; 可以查看这几个变量的值。这三个变量通常都设定为同一种字符集,用命令set names [charset name];就可以修改这三个变量的值。一般来说,只要你设定了能够表示你的数据的字符集,你查询的结果都可以在终端正确显示。比如你在数据库中存入了中文数据,不管存入时使用的什么字符集,你在终端即可以用set names命令设置为utf8,也可以设置为gbk编码,只要你的终端显示的字符集和你的设定一致就可以正确处理中文。
  举个例子,使用的表t1是utf8编码,表中的字段c1继承了这个编码,表创建如下
  mysql> create table t1 ( c1 text not null ) character set utf8;
  用的字符是汉字“范”,gbk编码为B7 B6,utf8编码为E8 8C 83
  用下面的SQL语句插入数据:
  mysql> insert into t1 values ('范');
  1、如果终端设置为utf8,并且执行了 set names utf8,那么插入到数据库中的就是“范”这个字的utf8编码,这个过程中MySQL不需要做编码转换。写入数据库的内容可以通过执行 select hex( c1 ) from t1;得到数据的十六进制编码来验证。


  2、如果终端设置为utf8,并且执行了set names gbk,那么执行完这个插入操作后,写入的二进制数据是E9 91 BC,这是汉字“鑼”的utf8编码。这是因为,终端输入的“范”用的是utf8编码,而服务器以为终端发送过来的内容是gbk编码,所以在向t1表中插入的时候进行了一次gbk到utf8的转换,结果当然是错误的。


  3、如果终端设置为gbk,并且执行了set names gbk,那么执行完插入操作后,写入t1的依然是“范”这个字的utf8编码。插入过程中,终端输入的是“范”的gbk编码B7 B6,服务器被告知终端发过来的SQL语句是gbk编码(由character_set_client指定),所以在插入数据前做了一次gbk到utf8的编码转换。


  4、如果终端设置为gbk,并且执行了set names utf8,那么执行完插入操作后,MySQL会报出一个数据被截断的警告。实际上,输入终端的是“范”这个字符的gbk编码B7 B6,而服务器被告知客户端发过来的SQL语句是utf8编码,所以在执行过程中没有做转码,直到插入数据的时候,发现B7 B6不符合utf8的编码规则,给出了警告信息,实际插入的数据是3F 3F,也就是两个问号。


  查询的时候是同样的道理,MySQL也是根据set names设定的字符集来对返回给客户端的结果集做相应的编码转换,如果转换的结果和终端显示的字符集一致,就能正确显示,如果不一致就是乱码。
  结论是,只要终端的字符集和set names指定的字符集一致就可以让MySQL在处理过程中执行正确的转码并且正确地显示。
  另外,如果通过程序操作MySQL数据库, 那么也需要事先执行set names命令来指定程序希望输出的字符集。比如,用程序从一个utf8编码的数据库向另外一个gbk编码的数据库进行数据迁移,在选取源数据库数据之前,需要执行set names gbk,才能取到gbk编码的数据。
分享到:
评论

相关推荐

    《MySql高级数据分析》期末测试.doc

    )表示命令结束,但在多行命令中,可以使用连字符(-)作为续行符。 18. **SQL联接查询**:在给出的SQL查询中,应该使用INNER JOIN或JOIN来连接读者、图书和借阅表,根据借书证号匹配记录,以获取0001号借书证的读者...

    2021-2022计算机二级等级考试试题及答案No.12544.docx

    引用类型包括字符串(string)等,它们是对象的引用,而不是直接包含数据。 Break语句在多重循环中用于提前退出最近的一层循环。 在HTML中,通过`&lt;link&gt;`标签可以引入外部CSS文件。 在Word中,可以通过设置对象格式...

    vb.net 考试试题

    - 选项 D 中的代码片段 `If y &gt;= x Then Max1 = y Max = x` 存在语法错误,正确的写法应该是 `If y &gt;= x Then Max1 = y Else Max1 = x` 或者使用其他方式来实现。 8. **数组声明**: - 正确声明二维数组的方法是 ...

    Python Cookbook

    17.10 调试内存问题 614 第18章 算法 616 引言 616 18.1 消除序列中的重复 619 18.2 在保留序列顺序的前提下消除其中的重复 621 18.3 生成回置采样 625 18.4 生成无回置的抽样 626 18.5 缓存函数的返回值 ...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    PowerBuilder程序设计(第2版)课件.ppt

    特殊ASCII字符、分隔符和续行符是理解语句结构的重要元素。对象及其属性、函数的引用方法直接影响代码的执行。PowerScript提供了多种数据类型,包括标准类型、Any类型、枚举类型和系统对象数据类型。变量的定义和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    java源码包2

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包3

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包4

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

Global site tag (gtag.js) - Google Analytics