WordPress升级后分类乱码的原因及解决

另外一个网站WordPress很久没有升级了,主要是嫌网站太慢,ssh上去操作麻烦,加上主人也很少更新。不过当WordPress Automatic upgrade出现之后这一切都简单多了我只要在页面上点点鼠标就能升级了,顺便还能把WP的文件和数据库打包下载到本地。同时,WP的新版2.5还支持插件的自动升级,以后无论是升级WP还是升级插件,基本上就不用ssh了。

WordPress Automatic upgrade的安装和WP的升级基本顺利,不过中间执行完upgrade.php升级数据库后,返回wpau有一个错误,没什么提示信息,直接retry后说升级不成功,清除结果再次运行就没问题了。

升级成功之后,blog标题成了??问号,我知道这是字符集的问题,看了看wp-include/wp-db.php中已经可以自动识别字符集(原来都是自己hack这个文件),就在wp-config.php中添加了两句配置:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

乱码问题解决。以为这就没什么事,又分类的名称怎么都成了“??”了,到分类管理里面一看还是问号,编辑修改成中文保存后依然是问号,如果改成英文的就没事了,其它的内容比如文章什么的中文都正常,怎么回事呢?

左思右想,觉得还是和升级时候的那个错误有关,我是从比较旧版本的WP升级过来的,以前是通过hack wp-include/wp-db.php文件设置数据库用utf8编码连接,升级过程中这个文件被新版文件覆盖了,而wp-config.php中添加相应设置之前有一个空档,而升级数据库恰恰是在这个空档时进行的。WP 2.3添加了tag功能,后来查看分类的数据表发现分类和tag是保存在一起的,所以可以确认这些被修改了的数据表在创建时,程序并不是使用utf8编码连接的数据库服务器,而是默认的latin1_swedish_ci字符集。在这样字符集的数据表中,自然是无法保存中文的,所以原来的中文、新输入的中文就都变成了问号。

解决方法有些麻烦,因为没有用phpMyAdmin,都是直接编辑好sql命令在mysql中执行的,好在涉及到的表不多:

  • wp_term_relationships
  • wp_term_taxonomy
  • wp_terms
  • wpau_active_plugins_info
  • wpau_upgrade_log

修改表的字符集语法如下:

ALTER TABLE [table_name]  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

这还没完,还得把每个表中的字符型字段的编码转换过来,这个就略微多一点了:

# 查看表中各列的详细情况,包括字符集:
show full columns from wp_term_relationships;

# 更改列的字符集或类型、长度
alter table  wp_term_taxonomy change taxonomy taxonomy varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wp_term_taxonomy change description description longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table  wp_terms change name name varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wp_terms change slug slug varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table  wpau_active_plugins_info change plugin_name plugin_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wpau_active_plugins_info change plugin_status plugin_status varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table wpau_upgrade_log change task_name task_name varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_status task_status varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_description task_description varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_log task_log text CHARACTER SET utf8 COLLATE utf8_general_ci NULL;

其实wpau的两个表不用改的,老外设计的程序一般不会写中文进去,改过来只是好看一些。

另外WP 2.5把slug弄没了很不舒服,虽然现在我只用id作permanent link,但还是原意有个整齐一点的slug更好看,所以用上了slugshow插件,希望WP啥时候把那个貌似智能其实很傻的功能改过来。

Update @ 2008-04-05

差点忘记了还有一个css裸奔节,顺便贴一下我blog首页穿衣服和不穿衣服的样子,首先是穿衣服的:

Free Image Hosting at www.ImageShack.us

然后是不穿衣服的:

Free Image Hosting at www.ImageShack.us

我的脱衣脚本还是很好用的嘛。

2 thoughts on “WordPress升级后分类乱码的原因及解决”

  1. 我3.0的,加了这个就没事了,感觉好像只是在低版本的mysql才有这个问题 define(‘DB_CHARSET’, ‘utf8’); define(‘DB_COLLATE’, ”);

    Reply

Leave a Reply

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