MySQL 4.0 数据导入到 MySQL 5.0 可能出现的问题

MySQL 4.1 和 5.0 的字符设置比 4.0 复杂很多,详见: Character Set Support

utf-8 的中文数据从 4.0 导入到 5.0 之后,PHP 读取似乎没什么异常,但是在 phpMyAdmin 里面看到的中文却都是乱码。这是因为一般 MySQL 5.0 的默认的 character_set_database 为 latin1 ,导入后的数据的 Collation 是 latin1_bin 或 latin1_swedish_ci 。这时候再用 phpMyAdmin 导出的数据也都是乱码,不能使用了。

 mysql> show variables like '%character%'; +--------------------------+-------------------------------------------+ | Variable_name            | Value                                     | +--------------------------+-------------------------------------------+ | character_set_client     | latin1                                    | | character_set_connection | latin1                                    | | character_set_database   | latin1                                    | | character_set_results    | latin1                                    | | character_set_server     | latin1                                    | | character_set_system     | utf8                                      | | character_sets_dir       | /data/mysql/fifteen/share/mysql/charsets/ | +--------------------------+-------------------------------------------+ 7 rows in set (0.00 sec) 

我解决这个问题的方法是先将 phpMyAdmin 的 libraries/select_lang.lib.php 文件中的 MySQL charsets map 中的(在 phpMyAdmin 2.7.0-pl2 中是第 263 行):

  1. ‘utf-8’ => ‘utf8’,

改为:

  1. ‘utf-8’ => ‘latin1’,

这样在 phpMyAdmin 里面就能正常显示 utf-8 的中文了。这样导出来的数据也就能用了。

将导出来的 sql 文件中的 character set 和 collate 分别都设成 utf8 和 utf8_general_ci ,同时把数据库的 collation 也改成 utf8_general_ci ,然后重新导到 MySQL 5.0 ,再把之前修改过的 select_lang.lib.php 改回原样,这样 phpMyAdmin 中的乱码问题就彻底解决了。

避免出现这个问题,只需在导入数据之前,先将数据库的 collation 设为 utf8_general_ci。

PHP 连接 MySQL 5.0 数据库后,最好先执行以下几句,以免因为 collation 问题而出现各种难以预见的错误:

  1. SET NAMES ‘utf8’
  2. SET CHARACTER SET ‘utf8’
  3. SET CHARACTER_SET_CLIENT = ‘utf8’
  4. SET COLLATION_CONNECTION=’utf8_general_ci’
  5. SET CHARACTER_SET_RESULTS = ‘utf8’
  6. SET CHARACTER_SET_SERVER = ‘utf8’

Updated 2006-3-13

Marco Fang 在回复里提出了另外一个很好的解决办法,我把它也贴到这里来了,谢谢! ^_^

1. mysqldump –default-character-set=latin1 foobar > foobar.sql 这样就会得出一个编码正确的档

2.更改foobar.sql内中的 latin1 字段为 utf8 (replace all latin1 -> utf8)

3.转换此 sql 档为 unicode(方便直接转换为正确的utf8编码)

4.在 phpMyAdmin 中导入 foobar.sql, 或是在 SQL 直接贴上 foobar.sql 的内容

4 thoughts on “MySQL 4.0 数据导入到 MySQL 5.0 可能出现的问题”

  1. 我看了你这篇文章中有了其他的想法,而且成功使用了另一种方法:

    1. mysqldump –default-character-set=latin1 foobar > foobar.sql
    这样就会得出一个编码正确的档

    2.更改foobar.sql内中的 latin1 字段为 utf8 (replace all latin1 -> utf8)

    3.转换此 sql 档为 unicode(方便直接转换为正确的utf8编码)

    4.在 phpMyAdmin 中导入 foobar.sql, 或是在 SQL 直接贴上 foobar.sql 的内容

  2. 你把数据库的内容用 phpmyadmin 导出来之后,存为 utf8 的文件,同时用 phpmyadmin 将数据库编码设置改为 utf8 ,然后重新导入就行了。

Leave a Reply to Marco Fang Cancel reply

Your email address will not be published. Required fields are marked *