首页mysql › 使用mysqldump 把GBK编码的数据库转换成UTF8存储

使用mysqldump 把GBK编码的数据库转换成UTF8存储

    打算把一个数据库编码为 utf8 的数据库,转换成gbk 来存储。以目前mysql的版本,先做一个转换测试..在数据很大量的情况下,我认为很有必要呵呵。 记下来备忘了。

 

目前mysql状态

mysql 版本: Server version:         5.1.41-log Source distribution

目前编码情况是这样的:

mysql> show variables like ‘character%’;
+————————–+—————————————–+
| Variable_name            | Value                                   |
+————————–+—————————————–+
| character_set_client     | gbk                                     |
| character_set_connection | gbk                                     |
| character_set_database   | gbk                                     |
| character_set_filesystem | binary                                  |
| character_set_results    | gbk                                     |
| character_set_server     | gbk                                     |
| character_set_system     | utf8                                    |
| character_sets_dir       | /usr/local/mysql5/share/mysql/charsets/ |
+————————–+—————————————–+

可以看到,除了mysql系统级默认是utf8版本外和mysql数据文件存储编码是binary 外,其他都是GBK编码。

我们先从原数据库备份出数据先,原数据库的编码和表、字段 都是UTF8等等

beihai365# mysqldump -u root -p –no-create-info –default-character-set=utf8 ud_sphinx > /usr/local/sqlbak/ud_sphinx.sql

–default-character-set=utf8  表示以 utf8为导出数据文件的内部编码

用vi 打开到处的数据库文件  ud_sphinx.sql  可以看到头部有这么一行

/*!40101 SET NAMES utf8 */;

说明了我们的这个数据库文件以utf8导出的。

这个是试验得出的结果~~不是书上的理论。

书上说  “–default-character-set=gbk 表示 设置以什么字符集进行连接”这个话看了真是莫名其妙…

如果证明导出的的文件内部编码就是utf8的呢

我们用ie打开导出的数据库文件  ud_sphinx.sql

ie -> 查看 -> 编码 . 我们选择gb2312来进行文本的显示,结果发现,看到的都是乱码

LOCK TABLES business WRITE;
/*!40000 ALTER TABLE business DISABLE KEYS */;
INSERT INTO business VALUES (1,1,’鍏揪,鑷杞?瓒婇噹,鎷撳睍,鍩硅’,’鍖楁捣鍏揪鑷杞?-涓撲笟鐨勫崠杞︽嫇灞曟椿 鍔?,’http://bada.beihai365.com/’),(3,3,’鐗涜叐,鐗涜叐绮?鐗涜叐寮?鐗逛骇’,’鍖楁捣鐗逛骇鐗涜叐绮夊ソ鍚 冧笉璐?,’http://www.beihai365.com/bbs/viewthread.php?tid=1380307′);
/*!40000 ALTER TABLE business ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

然后,我们选择 utf8编码来进行显示,就看到,中文显示正确了。

接下来开始创建一个一模一样数据结构的数据库,但数据库编码,和表、字段等编码都是GBK的

创建数据库:

create database ud_test character set=gbk;

为了快速,所以我们选择了复制表结构

mysql> create table business like ud_sphinx.business;

因为默认的  ud_sphinx.business 编码是 utf8,所以修改一下编码

alter table business character set gbk;

好,开始导入数据

我做了几个试验:

1 我没有显示显式在命令中指定导入编码

mysql -u root -p ud_test < /usr/local/sqlbak/ud_7.sql  ( 导入成功,无乱码)

2 我显式指定编码,而且还是指定了一个 latin1 编码

mysql -u root -p ud_test –default-character-set=latin1  < /usr/local/sqlbak/ud_7.sql (导入成功,无乱码)

3 我直接修改 ud_7.sql里面的  set names *  语句,指定为  gbk 编码

beihai365# mysql -u root -p ud_test  < /usr/local/sqlbak/ud_7.sql (乱码)

总结:

1   –default-character-set  参数导出的时候,是告诉mysql 生成的备份文件所使用的文件内码是啥。

2  导出的数据文件里面的 set names *  和 显式在命令中指定编码,优先起作用的是 数据文件里面的 set names *

转换数据库编码的时候关键几点:

第一个是源字符集和要导出的字符集的,数据集范围问题:小集变大集可以,大集变小集,可能会出现乱码。(可使用ie来选择编码来浏览看是否乱码)

第二个导入数据的时候,要注意数据文件的内部编码是什么(也就是导出 default-character-set=*指定的编码) ,还要注意,数据文件头部的 set names *  写的是什么编码。 内部编码和 set names 的编码要一至,导入的时候才不会出现乱码现象。 set names 是告诉mysql 以什么样的编码方式来导入这个数据文件。其实和 http server 里面的mime 一个道理。

okay 打完收工…

 

发表评论