Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2385672
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类: Mysql/postgreSQL

2009-01-07 16:54:37

mysql服务器中有六个关键位置使用了字符集的概念,他们是:client 、connection、database、results、server,
  a、其中client是客户端使用的字符集,相当于网页中的字符集设置如下
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
   b、其中的connection是连接数据库的字符集设置类型,如果没有指明连接数据库使用的字符集类型
就按照服务器端默认的字符集设置。
   c、其中database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装
时指定的字符集设置。
   d、server是服务器安装时指定的默认字符集设定。

server是最高的字符集设定,database没有单独设定就按照server的字符
集设定,其他都是按照server的设定设置字符集。还有,数据库内的每个表和字段也都有字符集的概念,一般都
是根据上一级结构决定自身的字符集,比如表就根据database库的设定决定自己的字符集,字段根据表来决定自己
的字符集。

二、统一字符集的方法:(以utf-8字符集为例,因为他是目前支持文字种类最广的字符集)

      1、彻底解决字符集的方法:

       要彻底解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可以使上面的六个关键
点的编码都为utf-8。

      a、 在windows下安装mysql有提示可以选择字符集,我们选择utf-8就可以了。

      b、在linux下有三种安装方法,第一种是rpm包安装,这种因为我没有使用过所以没有发言权。

         第二种为可执行程序安装,这种安装因为已经被编译成了latin1这种瑞典语的字符集,所以无法完全解决字
符集问题,这个版本我们后面会讲到怎么解决字符集问题。
         第三种为源码自行编译安装,这种安装可以在编译时设置字符集类型,这部分主要讲这种安装方式。

        在编译mysql是我们可以用这样的指令:./configure --default-character-set=utf8
这样,在编译的时候,就会把mysql的server项编译成utf8的编码,这样这个mysql下建立的所有数据库都将使用utf8
编码存储,所有有关的方面都是utf8编码。


 2、局部坚决字符集的方法:
 
        如果遇到自己的数据库使用的是默认安装的
latin1字符集的(很奇怪为什么mysql要使用这么个默认字符集)
的情况我们可以这样来解决。

       a、默认请况下我们在mysql命令行使用status指令察看状态,
可以看到:

还可以用SHOW VARIABLES LIKE 'character_set_%';指令察看内容如下:


这就说明,除system是utf8之外的所有内容的字符集都为latin1,我们怎么样才能使用utf字符集呢?
有人说可以在my.cnf文件的[mysqld]段中加入default-character-set=utf8这一项就可以解决,但经过我的实验,这一条
完全没有必要,以下是增加了这一项后得显示结果。



从上面可以看出,使用了配置文件中修改默认字符集的方法,并没有把client、connection、
results这三项改成utf8,而且在建数据库的时候我们可以通过这样的指令实现数据库的字符集设置:

 CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

这样此数据库内的所有表和字段都将为utf8字符集编码,所以在配置文件中修改的方法也就失去了意义。

     
     b、我的解决办法。

      我们可以完全无视数据库默认的字符集是什么,我们关心的只有数据库在建立的时候是不是加入了字符集
选择。

      (1)使用如下指令建立数据库:
       
     
     CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

       (2)另外一种解决办法参看上一篇文章;

数据库字符集尽量使用
utf8(utf-8),以使你的数据能很顺利的实现迁移,因为utf8字符集是目前最适合于实现多种不同字符集之间的转换的字符集,尽管你在命令行工具上无法正确查看数据库中的内容,我依然强烈建议使用utf8作为默认字符集.
接下来是完整的一个例子:
创建数据库表
mysql>CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

#注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8编码格式来排序
#那么在这个数据库下创建的所有数据表的默认字符集都会是utf8了

mysql>create table my_table (name varchar(20) not null default '')type=myisam default charset utf8;

#这句话就是创建一个表了,制定默认字符集为utf8

 

如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束,例如:

create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;

附:旧数据升级办法
以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:导出旧数据

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql

第二步:转换编码

iconv -t utf-8 -f gb2312 -c old.sql > new.sql

在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改old.sql,增加一条sql语句: "SET NAMES utf8;",保存。

mysql -h localhost -uroot my_db < new.sql

阅读(1189) | 评论(1) | 转发(0) |
0

上一篇:svn的使用

下一篇:如何为debian升级

给主人留下些什么吧!~~

chinaunix网友2009-10-13 00:28:07

iconv -t utf-8 -f gb2312 -c old.sql > new.sql 我的问题是,我执行这一步导入的就是乱码,不执行这一步就ok 全linux 环境