MovableType 3.2迁移涉及三个部分
1.mysqldump 导出时的charset转换
2.新建数据库时设置默认charset为utf8,导入数据库
3.在MT的cgi-bin的lib中DBI中的mysql.pm中加上set names指定MT默认提交的charset设定。
设计的细节较多,休息一会儿再写。 :)
补完 :)
事件:
将MT3.2从服务器A转移到服务器B。
我从电脑A导出mt数据库为sql文件,导入到电脑B,发现部分出现乱码。乱码频率高,不可忍受。
MT3.2数据库乱码原因:
服务器A和B上的MySql的MT数据库默认编码都是latin1。
意味着我们在MT上提交的数据都从默认的UTF8转成了latin1,并存储到数据库中。读取时,又从latin1转到了utf8,所以转移之前我们感觉不到问题。
但是此时,查看MySql中mt数据库mt_entry等含有中文字的表,都发现将是乱码。
当然除了这个还有更深层的原因。请看解决步骤。
1.导出服务器A上的mt数据库
点击开始, 选择“运行”, 键入cmd,进入命令行模式。
用cd命令进入mysql\bin,执行
mysqldump -uroot -p --default-character-set=latin1 --set-charset=utf8 --skip-opt mt > mt_backup.sql
(此处mt为mt数据库名,如果你的不同,请相应更改)
提示密码,输入,ok.
copy目录下mt_backup.sql到服务器B的mysql\bin目录下。
2.服务器B上新装mt3.2,建出数据库mt。删除数据库mt。新建数据库mt,选择默认编码为utf8。
这样的好处是,即使在phpMyadmin中查看也不是乱码了.
mysqldump -uroot -p --default-character-set=utf8 mt < mt_backup.sql
数据库导入成功。
3.将mt_blog表中一些原服务器A中的路径修改为服务器B中mt blog发布的路径。
这里很重要,注意不要弄错。
4.以上都弄完后,发现mt还是乱码,而且还乱的更厉害了,这是因为mt与后台建立连接时还是使用默认的latin1发起连接。导致了又一次的不必要转换。
解决办法,在mt所在的cgi-bin目录下的\lib\MT\ObjectDriver\DBI里面找到mysql.pm,用编辑器打开
找到sub init,在最后一句$driver;之前加上
$driver->{dbh}->do("SET NAMES 'utf8'");
然后再试试重建blog页面吧。
乌拉,一切OK。 Blog页面&PHPmyadmin中都正常显示中文字了。 ^_^
sub init {
my $driver = shift;
$driver->SUPER::init(@_);
my $cfg = $driver->cfg;
my $dsn = 'dbi:mysql:database=' . $cfg->Database;
$dsn .= ';hostname=' . $cfg->DBHost if $cfg->DBHost;
$dsn .= ';mysql_socket=' . $cfg->DBSocket if $cfg->DBSocket;
$dsn .= ';port=' . $cfg->DBPort if $cfg->DBPort;
$driver->{dbh} = DBI->connect($dsn, $cfg->DBUser, $cfg->DBPassword,
{ RaiseError => 0, PrintError => 0 })
or return $driver->error(MT->translate("Connection error: [_1]",
$DBI::errstr));
$driver->{dbh}->do("SET NAMES 'utf8'");
$driver;
}
参考文献:
http://www.simplicidade.org/notes/archives/2005/12/utf8_and_dbdmys.html
http://www.youthfly.net/blog/blogview.asp?logID=191






