博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql 已有数据情况下字符集的更改

Posted on 2011-12-08 15:23  liyanxue  阅读(563)  评论(0编辑  收藏  举报

   因为新的项目选用的数据库为mysql,开始建立数据库的时候字符集默认是latin1。后发现中文乱码,改成gb2312后中文没有问题。开发过程也没有发现问题,项目正式运行后发现一些生僻字居然录入不到数据库中。google说得使用gbk字符集,没有办法只能改数据库的字符集,因为已经运行了一段时间,字符集的修改不能直接通过"alter database character set *** " 或者 "alter table tablename character set *** "命令进行,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。所以必须的更改现有数据表的字符集,更改过程分为以下几步

(1) 导出表结构
mysqldump -uroot -p --default-character-set=gbk -d databasesename > createdb.sql
其中--default-character-set=gbk表示设置以什么字符集连接,-d表示只导出表结构,不导出数据
(2) 手工修改createdb.sql中表结构定义中的字符集为新的字符集 DEFAULT CHARSET=gb2312 替换为DEFAULT CHARSET=gbk
(3) 确保记录不再更新,导出所有记录
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=gb2312 databasename > data.sql
--quick:该选项用于转储大的表。它强制Mysqldump从服务器一次一行的检索表中的行,而不是检索所有的行,并输出前将它缓存在内存中
--extended-insert:使用包括几个values列表的多行Insert语法,这样使转储文件更小,重载文件更快
--no-create-info:不屑重新创建每个转储表的create table语句
--default-character-set=latin1:按照原有的字符集导出所有数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
(4) 打开data.sql,将SET NAMES gb2312 修改成SET NAMES gbk
(5) 使用新的字符集创建新的数据库
create database databasename default charset gbk;
(6) 创建表,执行createdb.sql
mysql -uroot -p databasename < createdb.sql
(7) 导入数据,执行data.sql
mysql -uroot -p databasename < data.sql