数据库编码导致discuz无法登录和注册

昨天帮客户买了VPS迁移网站。本来想着一会的的功夫,没想到倒也折腾了很久。从一开始备份网站程序、数据库都很顺利,到下单VPS,构建FTP server和IIS6的PHP+Mysql环境,似乎一切顺风顺水。可是等到网站恢复的时候,却发现discuz论坛的无登录和注册,验证码始终报错。

本以为是config.inc.php里UC_KEY和UCenter不对,登录Uc_server重新生成新的KEY后,发现通信成功,但是问题依旧。又开始怀疑是不是程序有问题,于是从logging.php一直追踪到uc_client的control->user->onlogin,这才发现还是方向不对。

考虑到旧的数据库是4.0,新的数据库是5.0。会不会导入数据的时候出错?万万没想到恰恰是数据库的问题,让我重第一步就犯下了致命错误。我忽略了一个细节,旧的服务器数据库编码默认是latin1,而新的utf-8编码。由于编码的不同,table的字段长度会发生变化,例如:

latin1: ip varchar(15) -> utf8: ip varchar(5)
latin1: charset varchar(8) -> utf8: charset varchar(2)
这种毁灭性的变化,不但让数据添加有问题,表格本身也千疮百孔,无法修改。以至于出现了discuz无法正常登陆的诡异现象。其实之前重新生成UC_KEY的时候就发现了一个现象,IP地址保存后变成了5位:216.1,但是当时没有特别在意这个问题。这是一个教训。