网络编程
位置:首页>> 网络编程>> 数据库>> MySQL乱码问题深层分析(2)

MySQL乱码问题深层分析(2)

作者:尹斌斌 来源:IT168 发布时间:2009-03-09 14:53:00 

标签:MySQL,乱码,编码,分析

MySQL 4.1.x开始支持以下这些事情

l 使用多种字符集(Character Set)来存储字符

l 使用多种校对规则(Collation)来比较字符串

l 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串

l 允许定义任何级别的字符集和校对规则

MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。 字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。

MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:

character_set_client     客户端字符集

character_set_connection   客户端与服务器端连接采用的字符集

character_set_results     SELECT查询返回数据的字符集

character_set_database    数据库采用的字符集

MySQL的字符集处理是这样的:

1、发送请求。

1)客户端发送请求到服务器端。

2)服务器端会把请求的数据从客户端字符集(character_set_client)转成服务器连接字符集(character_set_connection)。

3)然後服务器会检测存储区域(table,column)的字符集,然后把数据从连接字符集(character_set_connection)转为存储区域(table,column)的字符集,然後再存储或者查询。

2、返回请求。

1)服务器将存储区域(table,column)的字符集转换成服务器连接字符集(character_set_connection)。

2)将服务器连接字符集(character_set_connection)转换成结果字符集(character_set_results),再发送到客户端。

例如,我建立一个字符集为 gbk 的数据库(服务器端)。(MySQL 4.1 开始,在建立数据库时要指定它的字符集和校对规则,不指定就用默认的字符集和校对规则。)

连接数据库的程序(客户端)使用 gb2312 字符集(如 windows 命令行下使用 MySQL ,或者 PHP 连接MySQL ),那么在执行 insert 命令时,insert 的字符串将做一个 gb2312 到 gbk 的转换。而 select 时,数据库中保存的数据会先经过 gbk 到 gb2312 的转换之后再给你(结果集)。

好,那么为什么升级3.23(或4.0)到4.1时会乱码?举个例子说明。

例如3.23的数据库中保存的是gbk编码的数据。升级之前我将这些数据导出保存到文件里,这个文件的编码当然也是gbk的(因为3.23不支持多语言,不会对数据进行转换,也就是前面说的“原封不动地保存,原封不动地读出”)。

然后我在4.1中建立一个数据库,字符集为A;客户端字符集为B。将刚才的gbk数据导入。

1)A=gbk,B=gbk

导入数据时数据不会被转换;读出时需要set names gbk(set name命令下面将讲解)。

2)A=latin1,B=gbk

导入数据会进行gbk->latin1的转换,可能会丢失数据,产生乱码。

3)A=gbk,B=latin1

导入数据会进行latin1->gbk转换,可能会产生乱码。

4)A=latin1,B=latin1

导入数据时不会进行转换;读出时不需要set names gbk 。

大家可以看到,上面1)、4)才是正确的做法,即让A和B使用同样的字符集才不会乱码。

0
投稿

猜你喜欢

  •   [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋
  • 在设计主键的时候往往需要考虑以下几点: 1.无意义性:此处无意义是从用户的角度来定义的。这种无意义在一定程度上也会减少数据库的信息冗余。常常
  • <!--这是一个主页文件--><html><head><meta http-equiv="
  • 因为自己在设计的时候就对这些东西经常不是很在意,以为是很小的事情,结果往往给自己搞出不少的麻烦。可能大家没有我这么粗心,不过还是想提醒一下跟
  • Truncate是SQL中的一个删除数据表内容的语句,用法是:TRUNCATE TABLE [Table Name]。下面是对Truncat
  • 各位大家好!很荣幸能在这里和大家聊聊!(*^__^*) 嘻嘻……此处省略488字,切入正题。关于网页设计这个行业,在中国来讲这个行业并不成熟
  • ISNULL     使用指定的替换值替换   NULL。   &nb
  • '*************************************************'函数名:getMaxO
  • 摘要:本文介绍了有关数据表的优化技巧,主要内容有,选择表的类型,打开尽量少的表,锁定表与查询速度的关系以及如何优化表以达到提高查询速度的目的
  • 经常上网的人一定碰到过找不到页面的情况,此时是否有点让人沮丧呢,本文介绍了一些404页面设计优秀的例子,当我们撞见些好玩可爱的页面时,有时反
  • 而Easp类中提供了大量实用的ASP通用过程及方法,可以简化大部分的ASP操作。目前只提供了VBScript版,JScript版将来可能会提
  • 这是一篇关于使用JScript RuntimeObject(MSDN)调试的文章。虽然这些例子中的大多数在其他浏览器中不能运行,但在IE 5
  • 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件
  • 本篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。注意!虽然这是
  • asp之家注:作为一个学习asp的爱好者,相信一定接触过session,我们经常使用session来作为会员登录的验证,当然也可以使用COO
  • 下面是我写的NumericStepper:谢谢 果果 和 Rimifon , 我对代码进行了完善, 支持自适应小数位数:
  • 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧。 关键词:动态SQL,PL/SQL,高性能 1. 静态SQL
  • 为什么我把自己机子上的数据库备份文件往另一台机子上还原不成功?可能是你在Restore的对话框中选项不正确。Restore 有三个选项,分别
  • acronym从字义上理解,是取首字母的缩写词,abbr是缩写,在应用过程中,两个标签看起来差不多,但个人觉得还是有区别的。看下面的例子:&
  • 文件:.wmv;大小:19,535KB;长度:00:26:39。 下载地址:SqlFunction_udf_Week.rar以下内容于201
手机版 网络编程 asp之家 www.aspxhome.com