打算把一个数据库编码为 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 打完收工...