当前位置:首页 > 编程开发

mysql字符编码集

webgou17年前 (2009-10-10)编程开发381

mysql字符编码集
来源:www.ik8.com 2008年05月31日 星期六 下午 09:18
我们经常在telnet终端操作MySQL数据库时会遇到中文乱码问题,这主要是因为字符集设定错误造成的。这里面涉及到好几个地方的字符集设置,如果我们搞清楚它后面的原理,就可以很容易解决这些乱码问题。
   在MySQL的客户端上执行一次查询的过程一般是,在客户端的提示符后面输入一条SQL语句,回车,然后终端显示出查询的结果。这个过程中,只有终端和 三个MySQL的系统变量指定了正确的字符集,才能保证我们将一个正确的SQL语句送到服务器,然后服务器返回正确的结果,并且在终端正确显示。

  三个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编码的数据
 
 

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=26

标签: mysql
分享给朋友:

“mysql字符编码集” 的相关文章

什么是DVB-H

   DVB,数字视频广播Digital Video Broadcasting的缩写, 是由DVB项目维护的一系列国际承认的数字电视公开标准。DVB-H标准是建立在DVB和DVB-T两个标准之上的标准。DVB-H系统并不是简单的将数 据广播和DVB-T融合在一起,这主要是因为D…

Android核心模块内容概述

Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其Android核心模块结构自下而上分为以下几个层次:第一、操作系统层(OS)第二、各种库(Libraries)和Andr…

wince 界面定制--在shell原码上修改步骤

wince 界面定制--在shell原码上修改步骤:(在x86环境下,修改ceshell中的代码)1、将WINCE500\PUBLIC\SHELL\OAK目录下的HPC文件夹(shell源码)复制到本文件夹下,将该文件夹改名,如myshell2、修改WINCE500\PUBLIC\SHELL\OAK…

DPI与像素的关系

DPI就是DOT PER INCH 每英寸象素数 1英寸=2.54厘米 不是说600万象素用多少DPI打,一般照片的DPI都是固定的,比如大多数机器都设定为72,那么600万象素的照片长是3400象素,每英寸72象 素,那么打印出来就是长47英寸,合119厘米,大约1.2米,明白了哦?很大的一副画呢…

const常类型说明

常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名 常成员函数: 类名::fun(形参) const 常数组: 类型说明符 const 数组名[大小] 常指针: cons…

UE4游戏汉化通用教程|第一篇:Pak解包和打包以及简单导出并汉化文本文件

 Pak解包和打包Pak文件就是UE4游戏生成的数据包文件,PC游戏一般放在游戏路径下的Content\Paks,安卓则在obb解包后游戏路径下的Content\Paks中,一般汉化所需的文本都放在pakchunk0-WindowsNoEditor.pak(PC端)或者pakchunk0-…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。