昨天在安装[name]Ultimate Tag Warrior, http://www.neato.co.nz/ultimate-tag-warrior/name,输入中文tag名字时,碰到一条错误信息:
WordPress database error: [Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘=’]
这显然是php程序中设定的collation编码和数据库设定的collation编码不同造成的冲突。
wp的字符编码collations设定是utf8,而UTW的3个表post2tag,tags,tag_synonyms用sqlyog查看都是latin1_swedish_ci。网上查了下资料,发现UTW在first time active的时候会建表,而建表用的collation是根据数据库的编码default来了。想起来我在建wp后台mysql库的时候只是缺省的用create database而没有加任何char set,自然编码都是跟着缺省用的latin-1了。幸好去年在玩vbulletin论坛升级的时候,有玩过转码,就如此这般的搞了一下:
# mysqldump -uroot -p –extended-insert=FALSE –opt dbname > dbname_before.sql
# sed -e ’s/latin1/utf8/’ dbname_before.sql > dbname_after.sql
# mysql -uroot -p
mysql>drop dbname;
mysql>create dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql>exit;
#mysql -uroot -p –default-character-set=utf8 dbname < dbname_after.sql
(# 是unix 提示符,mysql> 是mysql的提示符):
首先使用不加任何编码参数的mysqldump命令行导出,导出的就是原来latin1的,–extended-insert=FALSE是避免Insert语句太长而导致出错;导完后用less可以看到,建表字符集都是表明的latin1
接着sed其实是个unix上的一个流式编辑器(stream editor),把一个文件当字符流读入,根据后面的替换规则替换相应字符,-e ’s/latin1/utf8/’ 就是把所有latin1的地方换成utf8
然后进入mysql把原来的database 删掉,再用带char set/collate参数的 create database建立缺省编码是utf8的数据库
最后导入处理过的sql文件到新建的数据库中,带default-character-set参数指明编码。
—阅读本主题的博客原贴
最新评论