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

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

Message rejected for Sector 5 policy reasons

用邮件订阅了一些google groups讨论组,发现有些文章值得保存的话,我会用mail forward转发到自己的另外一个讨论组,这样便于以后查找,可有些邮件在转发的时候会失败,gmail会返回一封“Delivery Status Notification (Failure)”发送失败的邮件,内容如下:

This is an automatically generated Delivery Status Notification Delivery to the following recipient failed permanently: somewhere@googlegroups.com Technical details of permanent failure: PERM_FAILURE: Message rejected for Sector 5 policy reasons —– Original message —– ……

退信的原因是“Sector 5“,而这个神秘的“Sector 5“ google并没有给出详细的内容,哪怕是出处也没有。网上也有很多人遇到了类似的情况,甚至在一些google groups中也有讨论,但都没有结果,google官方也没有出面指明。不过,今天在看某个电影的时候,发现了这个:

FBI WARNING

这是大家常见的“FBI WARNING”信息,就是警告信息,一般正规影碟前面都有的,告诉观众不得非法传播、拷贝,否则最高可以判5年徒刑或者罚款25万美元(够恨的),而在这些的法律依据,就是“Title 17 U.S.Code, Section 501, 506 and 508”。

所以我觉得gmail退信的原因,和这个Section 501等等有关系,没准就是同一部法律,或者类似的条款,都是关于版权保护的内容。gmail在我转发邮件的时候,发现转发的内容不是我写的,并且和其他groups中的文章惊人的相似,所以就以“Sector 5”为由,拒绝我传播“盗版”了。

Update @ 2008-03-23

找到一篇和508沾边但仍未完整解答我的疑问的文章:section 508

WordPress在IE下Sidebar显示定位错误的问题已解决

一直使用Firefox,偶尔用IE上一下这个Blog,却发现Sidebar显示在了首页所有文章的下面,究其原因,原来是在最近的几篇文章中,有几个pre或code元素的宽度超出了左边这部分的宽度,从而占用了右边的Sidebar的空间,而IE又没有很好的解决Overflow的问题(参见Migrate apps from Internet Explorer to Mozilla中的CSS overflow differences部分),于是在css中添加如下代码:

#sidebar {position: absolute; left: 120px;}

将Sidebar改为绝对值定位,问题解决,同时将pre和code加上了

overflow: auto;

这样贴代码的时候如果宽度太宽,会自动出现水平滚动条的,当然,由于IE没有很好的支持这项属性,因此在IE下是看不到这个效果的。