热搜词
发表于 2012-4-10 17:49:48 | 显示全部楼层 |阅读模式
      MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,MySQL版本的升级、降级,特别是升级MySQL的版本,为了不让程序继续沿用Latin1字符集,这就需要我们进行字符集的转换!本人转换过好多数据了,也用过了好多的办法,个人感觉最好用的就是使用MySQL命令导出导入中将字符集转换过去,转换的基本思想是把数据库用原字符集把数据导出,然后用新的字符集把数据导入。

实例:
现假设数据库版本是mysql 5.0的,数据库名是 db_name,数据库连接的用户名是root,密码是123456,连接主机是 localhost,把gbk编码转换为utf8编码。

在网上找了些资料摸索了一阵子,得出下面语句可以成功转换,下面是转换操作步骤。

方法一:
1.用mysqldump工具导出sql文件:

mysqldump -uroot -p123456 --default-character-set=utf8  --compatible=mysql40 db_name > db_name.sql

经测试,以上语句导出的sql文件能正常导入到utf8编码的新数据库中,导入到新数据库中的数据自动转换为utf8编码。

mysqldump -uroot -p123456 --default-character-set=utf8  db_name > db_name.sql

经测试,以上语句导出的sql文件能正常导入到utf8编码的新数据库中,但导入到新数据库中数据仍为原来的gbk编码。

参数解释:
-u与root之间可以不用加空格,其它也一样,加空格也行
--default-character-set=utf8  设置以什么字符集连接,并不会改变数据库中具体数据的编码设置
--compatible=mysql40  是为了保证导出的具体数据不包含字符集设置,非常重要,不加此选项导入时不会改变原有编码
--skip-opt  将每条数据分开导出, 若你的表数据过多,或者要在服务运行期间备份,建议加此选项


2.用文本编辑软件修改导出的sql文件,添加 set names 'utf8';
接下来我们还不能直接导入回去,要对db_name.sql文件做做手脚才行。使用ultraedit32文本编辑软件打的db_name.sql文件,要在所有SQL执行语句之前,即在文件中 Dumping data for table ‘***’的后面,INSERT INTO 语句之前加上如下一句:

set names 'utf8';

只要加在第一个表之前,就象下面这样:


  1. --
  2. -- Table structure for table `pw_actions`
  3. --
  4. set names 'utf8';

  5. CREATE TABLE `pw_actions` (
  6. `id` smallint(6) unsigned NOT NULL auto_increment,
  7. `images` char(15) NOT NULL default '',
  8. `name` char(15) NOT NULL default '',
  9. `descrip` char(100) NOT NULL default '',
  10. `type` char(15) NOT NULL default '',
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=MyISAM;

  13. --
  14. -- Dumping data for table `pw_actions`
  15. --
复制代码

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

如果导出语句中不含 --compatible=mysql40 选项,还需要在导出的sql文件中查找“DEFAULT CHARSET=gbk”,替换为“DEFAULT CHARSET=utf8”,来指定表的存储编码。然后保存。

3. 新建一个默认编码为utf8的新数据库(new_db_name ),
用 Navicat for MySQL 图形管理工具创建新数据库,并设置“字符集”为utf8,“整理”为utf8_general_ci

也可以运行以下命令创建数据库:
CREATE DATABASE `new_db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

参数解释:
注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8编码格式来排序

4. 导入数据
用 Navicat for MySQL 图形管理工具打开新数据库,选择运行SQL语句,并设置连接字符集为utf8。

也可以运行以下命令导入数据:
mysql -uroot -p123456 --default-character-set=utf8 new_db_name < db_name.sql

后续分析:
        用mysqldump导出时,default-character-set只会影响生成的文件格式,数据库中数据的具体编码是不受影响的。由于导出的文件要导入到utf8编码的数据库中,所以如上的语句要添加参数–default-character-set=utf8,这样导出来的数据库备份文件就是utf8格式的文件了;


        这里需要注意的问题,还有另一个参数--compatible=mysql40,这个参数带上后就不会把原数据库中的编码设置导出来,比如我要导出的数据库是gbk编码的,如果不加--compatible=mysql40这个参数,那导出来的文件中创建表的语句中就会带有DEFAULT CHARSET=gbk,如果这样的话导入数据时,即使数据库是utf8编码的,导入后表的编码也会变成gbk的。所以要加--compatible=mysql40 这条参数,这样就不会在数据库备份文件中带有DEFAULT CHARSET=gbk  这样的内容,这样就可以导入到utf8编码的数据库中,而且导入的表也使用的是当前数据库设置的默认编码。


方法二:
1.分别导出数据库结构与数据内容:
mysqldump -uroot -p123456 --default-character-set=utf8  --compatible=mysql40  -d db_name > db_name_d.sql

mysqldump -uroot -p123456 --default-character-set=utf8  --compatible=mysql40 --skip-opt -t db_name > db_name_t.sql


参数解释:
-d
-t
--default-character-set=utf8  设置以什么字符集连接,并不会改变数据库中具体数据的编码设置
--compatible=mysql40  是为了保证导出的具体数据不包含字符集设置,非常重要,不加此选项导入时不会改变原有编码
--skip-opt  将每条数据分开导出, 若你的表数据过多,或者要在服务运行期间备份,建议加此选项



2.用文本编辑软件修改导出的sql文件,添加 set names 'utf8';
接下来我们还不能直接导入回去,要对db_name.sql文件做做手脚才行。使用ultraedit32文本编辑软件打的db_name.sql文件,要在所有SQL执行语句之前,即在文件中 Dumping data for table ‘***’的后面,INSERT INTO 语句之前加上如下一句:

set names 'utf8';

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;


3. 新建一个默认编码为utf8的新数据库(new_db_name ),
用 Navicat for MySQL 图形管理工具创建新数据库,并设置“字符集”为utf8,“整理”为utf8_general_ci

4. 导入数据
用 Navicat for MySQL 图形管理工具打开新数据库,选择运行SQL语句,并设置连接字符集为utf8。


全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-12-27 11:15 , Processed in 0.201314 second(s), 23 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team