需求:
我用的是DH的空间,现在要将整个网站移植到要地,也算是网站的一种备份吧
问题:
用dh的phpmyadmin导出数据库后,打开导出的sql文件,发现中文是乱码,因此不管以后如何处理,导入到其它mysql数据库都是乱码
环境:
<!--[if !supportLists]-->1、<!--[endif]-->DH上的数据库
版本:5.0.24a-standard-log
mysql> show variables where variable_name like 'char%';
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /data/mysql/head/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.00 sec)
2、本地数据库
4.1.22-community-nt
MySQL 字符集: UTF-8 Unicode (utf8)
Mysql连接校对utf8_unicode_ci
参考网上的文章,以下方法可以实现导入及导出都不是乱码
<!--[if !supportLists]-->一、<!--[endif]-->导出DH上的mysql5数据库
不要用dh的phpmyadmin,直接用mysqldump,用法如下
mysqldump -hmysql.yourdomain.com --add-drop-table --default-character-set=latin1 --user=youruser --password=yourpassword --extended-insert=false databasename > databasename.sql
说明:使用时将代码的下面几项进行修改
<!--[if !supportLists]-->1 <!--[endif]-->mysql.yourdomain.com改成你自己的数据库所在的服务器的域名,应当可以填IP的,我没有试过
<!--[if !supportLists]-->2 <!--[endif]-->youruser改成你自己的mysql用户名
<!--[if !supportLists]-->3 <!--[endif]-->yourpassword改成你自己的mysql相对应的密码
<!--[if !supportLists]-->4 <!--[endif]-->database改成你要备份的数据库各
<!--[if !supportLists]-->5 <!--[endif]-->databasename.sql改成你想要生成的sql文件名
导出后,你可以用记事本打开测试,如果你打开后发现中文没有显示乱码,祝贺你,成功了一半。
注:
dh的mysql默认不能远程连接,要在后台修改才能使用上面的命令。我们可以用ssh连上mysql空间,再连接上mysql服务器,然后再使用mysqldump命令。但是,请注意又一个但是,使用mysqldump时要提醒你没有权限,这需要到后台设置权限,因为我是合租dh的空间,是别人帮我改的权限,因此我也不知道如何设置了。
<!--[if !supportLists]-->二、<!--[endif]-->将导出的数据库导入到本地或其它地方的数据库中
注意做导入之前要修改一下导出的sql文件,否则导出时会出现错误,错误代码如下
ERROR 1071 (42000) at line 398: Specified key was too long; max key length is 1000 bytes
修改方法:打开刚才导出的sql文件,找到
UNIQUE KEY `section_value_value_aro` (`section_value`,`value`),
UNIQUE KEY `jos_kaigacl_section_value_value_aro` (`section_value`,`value`),
将这两行注释,也就是改成
#UNIQUE KEY `section_value_value_aro` (`section_value`,`value`),
#UNIQUE KEY `jos_kaigacl_section_value_value_aro` (`section_value`,`value`),
保存就ok了。
现在开始导入了,这里有两种方法,一是使用phpmyadmin,先建一个同名数据库,编码选默认的utf8,然后选择这个数据库,然后选择导入,选择刚才导出的文件即可,还有一种方法是使用mysql命令mysql --default-character-set=utf8 databasename -hhostname -uusername -pyourpassword < d:\database.sql
其它的数据库版本的导入及导出没有做过,可以参考。
以上做法参考
<!--[if !supportLists]-->1、 <!--[endif]-->http://hi.baidu.com/qjchina/blog/item/cd2f5266bf63f425aa184c2d.html
<!--[if !supportLists]-->2、 <!--[endif]-->http://www.fwolf.com/blog/post/310 作者:fwolf
附此文如下,讲得更详细
很久没有倒腾过mysql的字符集了,都疏忽了,以致于为LP安装Dreamhost上主机的时候,居然没有修改mysql数据库的字符集。也是由 于mysql这东西,即使字符集设置错了,也是吃啥吐啥,拿错误的字符集就往数据库里存,所以外面根本看不出来。今天给LP写了个自动备份脚本,才发现导 出的sql中全是乱码,岂能容忍?遂解决之~
首先还是放松了警惕,走了个弯路,我习惯使用的dump脚本是:
<span style="font-size: 9pt;">mysqldump --add-drop-table --default-character-set=utf8 -h mysql.mydomain.com --user=fwolf --password=mypasswd --extended-insert=false fwolf_db > mydomain.com_db.sql</span><span style="font-size: 9pt;"> </span>
%3Cspan%20style%3D%22font-size%3A%209pt%3B%22%3Emysqldump%20--add-drop-table%20--default-character-set%3Dutf8%20-h%20mysql.mydomain.com%20--user%3Dfwolf%20--password%3Dmypasswd%20--extended-insert%3Dfalse%20fwolf_db%20%3E%20mydomain.com_db.sql%3C%2Fspan%3E%3Cspan%20style%3D%22font-size%3A%209pt%3B%22%3E%20%3C%2Fspan%3E
可是dump出来的sql一看中文全是乱码,于是去掉--default-character-set=utf8再dump,数据依旧,一时没想过来,用iconv把dump出来的sql左转换右转换怎么也是不对,后来才想明白,DH上mysql字符集的默认设置是这样的:
mysql> show variables where variable_name like 'char%';
mysql%3E%20show%20variables%20where%20variable_name%20like%20%27char%25%27%3B
+--------------------------+--------------------------------------------+
%2B--------------------------%2B--------------------------------------------%2B
| Variable_name | Value |
%7C%20Variable_name%20%20%20%20%20%20%20%20%20%20%20%20%7C%20Value%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
+--------------------------+--------------------------------------------+
%2B--------------------------%2B--------------------------------------------%2B
| character_set_client | latin1 |
%7C%20character_set_client%20%20%20%20%20%7C%20latin1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_connection | latin1 |
%7C%20character_set_connection%20%7C%20latin1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_database | latin1 |
%7C%20character_set_database%20%20%20%7C%20latin1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_filesystem | binary |
%7C%20character_set_filesystem%20%7C%20binary%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_results | latin1 |
%7C%20character_set_results%20%20%20%20%7C%20latin1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_server | latin1 |
%7C%20character_set_server%20%20%20%20%20%7C%20latin1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_set_system | utf8 |
%7C%20character_set_system%20%20%20%20%20%7C%20utf8%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C
| character_sets_dir | /data/mysql/ovadilla/share/mysql/charsets/ |
%7C%20character_sets_dir%20%20%20%20%20%20%20%7C%20%2Fdata%2Fmysql%2Fovadilla%2Fshare%2Fmysql%2Fcharsets%2F%20%7C
+--------------------------+--------------------------------------------+
%2B--------------------------%2B--------------------------------------------%2B
8 rows in set (0.00 sec)
8%20rows%20in%20set%20%280.00%20sec%29
数据库服务器字符集是latin1,也就是mysql默认的latin1_swedish_ci,而系统的默认字符集则是utf8,所以不带--default-character-set=utf8参 数dump的数据的时候,其实和带上这个参数是一样的!想通这个问题,又知道了mysql吃啥吐啥的特性之后,解决方法就简单了,记住如果 WordPress和mysql都是默认设置的情况下,如果你能夠正常浏览中文,则说明配置就是错误的,因为WordPress默认也不是utf8字符集 的。
首先,按latin1字符集导出sql:
mysqldump --add-drop-table --default-character-set=latin1 -h mysql.mydomain.com --user=fwolf --password=mypasswd --extended-insert=false fwolf_db > mydomain.com_db.sql
mysqldump%20--add-drop-table%20--default-character-set%3Dlatin1%20-h%20mysql.mydomain.com%20--user%3Dfwolf%20--password%3Dmypasswd%20--extended-insert%3Dfalse%20fwolf_db%20%3E%20mydomain.com_db.sql
这样导出的sql中的中文应该都是正确的了,现在修改导出的sql文件,把其中的latin1全部替换为utf8,然后再重新导入数据库,导入的时候强制指定字符集为utf8:
mysql --default-character-set=utf8 fwolf_db -h mysql.mydomain.com -u fwolf -pmypasswd < mydomain.com_db.sql
mysql%20--default-character-set%3Dutf8%20fwolf_db%20-h%20mysql.mydomain.com%20-u%20fwolf%20-pmypasswd%20%3C%20mydomain.com_db.sql
这样,如果直接用mysql查询数据的话,如果不使用set names 'utf8',中文应该是乱码的,而如果你的数据库字符集仍然是默认的latin1的话,会是相反的情况:不使用set names 'utf8',中文正常,使用之后反而乱码。确认数据库字符集调整正确之后,再来搞定WordPress,这个就简单多了,编辑文件WP/wp-includes/wp-db.php,大概66行,在$this->select($dbname);前面,加上:
$this->query('set names utf8'); -
-
%24this-%3Equery%28%27set%20names%20utf8%27%29%3B%0A%0D%0A%20
这样就全部搞定了,数据库和Wordpress的字符集全部调整为万国码utf8。 向朋友推荐 |