latin1_swedish_ci to utf8_general_ci

从旧主机搬到新主机最烦人的就是乱码问题。这也是个由来已久的问题了。
wordpress 2.2开始,wordpress提供DB_CHARSET和DB_COLLATE这两个参数以便我们更好地解决这个问题。但似乎这些并不够,仍旧会产生这样那样的问题,如Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\wordpress\wp-includes\classes.php on line 88。最根本的解决应该还是把数据库里的数据由latin1_swedish_ci格式转换成utf8_general_ci格式。
wordpress官方的论坛就像wordpress那样,很有人气。你遇到的问题,很可能里面已经有人讨论过并已经解决了。乱码问题这个很热门的问题,当然也是完美地解决了地。
以下方法涉及数据库修改,请在备份数据库后操作!
解决的方法是这样的:
1. 下载g30rg3_x提供的这个plugin;
2. 确保你的wordpress是2.2.x或2.1.x,因为这个plugin只支持这两个系列的版本;
3. 上传到plugins文件夹并激活;
4. 到’UTF-8 Database Converter’菜单中按照提示进行剩余操作即可。

上面的办法多了不少的限制,如wordpress的版本需是2.2.x或2.1.x,并能保证你的wordpress还能登录!(是的,很可能你的wordpress这时已经不能登录了。)
这时我们可以借用一下g30rg3_x提供的UTF8_DB_Converter_DoIt()函数:

  1. <?php
  2. define('DB_NAME', 'putyourdbnamehere');    // 数据库名
  3. define('DB_USER', 'usernamehere');     // MySQL用户名
  4. define('DB_PASSWORD', 'yourpasswordhere'); // 密码
  5. define('DB_HOST', 'localhost');    // 很大可能你无需修改此项
  6.  
  7. function UTF8_DB_Converter_DoIt() {
  8.     $tables = array();
  9.     $tables_with_fields = array();
  10.  
  11.     // Since we cannot use the WordPress Database Abstraction Class (wp-db.php),
  12.     // we have to make an a stand-alone/direct connection to the database.
  13.     $link_id = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die('Error establishing a database connection');
  14.     mysql_select_db(DB_NAME, $link_id);
  15.  
  16.     // Gathering information about tables and all the text/string fields that can be affected
  17.     // during the conversion to UTF-8.
  18.     $resource = mysql_query("SHOW TABLES", $link_id);
  19.     while ( $result = mysql_fetch_row($resource) )
  20.         $tables[] = $result[0];
  21.  
  22.     if ( !empty($tables) ) {
  23.         foreach ( (array) $tables as $table ) {
  24.             $resource = mysql_query("EXPLAIN $table", $link_id);
  25.             while ( $result = mysql_fetch_assoc($resource) ) {
  26.                 if ( preg_match('/(char)|(text)|(enum)|(set)/', $result['Type']) )
  27.                     $tables_with_fields[$table][$result['Field']] = $result['Type'] . " " . ( "YES" == $result['Null'] ? "" : "NOT " ) . "NULL "( !is_null($result['Default']) ? "DEFAULT '". $result['Default'] ."'" : "" );
  28.             }
  29.         }
  30.  
  31.         // Change all text/string fields of the tables to their corresponding binary text/string representations.
  32.         foreach ( (array) $tables as $table )
  33.             mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET binary", $link_id);
  34.  
  35.         // Change database and tables to UTF-8 Character set.
  36.         mysql_query("ALTER DATABASE " . DB_NAME . " CHARACTER SET utf8", $link_id);
  37.         foreach ( (array) $tables as $table )
  38.             mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8", $link_id);
  39.  
  40.         // Return all binary text/string fields previously changed to their original representations.
  41.         foreach ( (array) $tables_with_fields as $table => $fields ) {
  42.             foreach ( (array) $fields as $field_type => $field_options ) {
  43.                 mysql_query("ALTER TABLE $table MODIFY $field_type $field_options", $link_id);
  44.             }
  45.         }
  46.  
  47.         // Optimize tables and finally close the mysql link.
  48.         foreach ( (array) $tables as $table )
  49.             mysql_query("OPTIMIZE TABLE $table", $link_id);
  50.         mysql_close($link_id);
  51.     } else {
  52.         die('<strong>There are no tables?</strong>');
  53.     }
  54.  
  55.     return true;
  56. }
  57. UTF8_DB_Converter_DoIt();
  58. ?>

现在你把上面代码保存到一个php文件中,上传至空间并运行,如无意外你的数据已经完成了latin1_swedish_ci到utf8_general_ci转换。

Dreamhost自动备份mysql

在查找“用SSH备份mysql”时,发现的——“Dreamhost下每天自动备份mysql数据库,并发送到指定邮箱”。
觉得比wordpress的一些备份plugin好,决定启用。

1、用putty登录你的dreamhost;
2、运行

  1. cd ~
  2. mkdir backups
  3. mkdir backups/archives

3、新建一个名为“mysql.sh”的文件,并输入下列代码:

  1. #!/bin/bash
  2. cd /home/username/backups/ #username改为你登录ssh时用的用户名
  3. mkdir mysql 
  4. suffix=$(date +%y%m%d)
  5. mysqldump --opt -uUser -pPass -h mysqlA.domain.com db_nameA > mysql/db_nameA.$suffix.sql #User为数据库用户名,pass为数据库用户密码,mysqlA.domain.com为数据库地址,db_nameA为数据库名,请根据你的情况修改。
  6. tar zcf archives/mysql_backup.$suffix.tar.gz mysql/*
  7. rm -r mysql/
  8. mutt you@domain.com -a /home/username/backups/archives/mysql_backup.$suffix.tar -s "MySQL Backup" #you@domain.com修改为你准备用于收取备份压缩包的邮箱。

保存后,上传到backups文件夹中。
4、在putty中运行

  1. dos2unix ~/backups/mysql.sh
  2. chmod 755 ~/backups/mysql.sh

5、在Dreamhost的panel,Goodies->Cron Jobs中新建Cron任务,选项设置为
Command to run: /home/User/backups/mysql.sh
#User改为你登录SSH时用的用户名。
时间照下图设置,将在北京时间每天的24:10左右运行备份MySQL程序,并发送备份压缩包到你指定的邮箱。
cron time setting
6、完成!

参考文献:wiki.dreamhost.com
Green Web Hosting! This site hosted by DreamHost.

wordpress导入后出现乱码之解决

昨天下了wamp5,准备再好好学学PHP和玩一下wordpress。
没想到一来就弄个麻烦的~从空间上备份的数据,导入到本地数据库后,竟然是一堆乱码(形如:????),自己是搞鼓了一整天(试了几乎所以相关的utf8编码都是不行)也是没搞定。
自己搞不定就找人问吧。来到海豚在google论坛上建的论坛上发言,下午海豚告诉我在苛世录上可找到解决办法,跟去→桑林志Windix’s Weblog阿修的部落格
原因是:

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章”Character Set Support“后终于找到了解决方法并测试通过。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

  1. SET NAMES 'utf8';

解决办法是:
一、导入数据时,新建的数据库collation (校勘/整理)项选择为utf8_general_ci;
二、修改wp-includes/wp-db.php为

  1. $this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
  2. //加上下面這行
  3. $this->query("SET NAMES 'utf8' ");

至此,问题解决。