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';
只要加在第一个表之前,就象下面这样:
- --
- -- Table structure for table `pw_actions`
- --
- set names 'utf8';
- CREATE TABLE `pw_actions` (
- `id` smallint(6) unsigned NOT NULL auto_increment,
- `images` char(15) NOT NULL default '',
- `name` char(15) NOT NULL default '',
- `descrip` char(100) NOT NULL default '',
- `type` char(15) NOT NULL default '',
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM;
- --
- -- Dumping data for table `pw_actions`
- --
复制代码
它相当于下面的三句指令:
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。
|
|