刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

ようやくtritonnに移行完了

ハイパー長い戦いだった...。

とりあえず何をしていたかを書くと、

$ mysqldump -c -n -u mysql db --default-character-set=latin1 > dump

こんな感じ。

$ mysqldump -c -n -u mysql db --default-character-set=latin1 | sed -e 's/latin1/utf8/g' > dump

  • データもeuc-jpからutf8に変換

$ mysqldump -c -n -u mysql db --default-character-set=latin1 | sed -e 's/latin1/utf8/g' | iconv -c -f EUC-JP-MS -t UTF-8//IGNORE > dump

  • ちなみに-cとIGNOREは多分同じことをする気がするけど、一応つけておいた。つけないと詰まった。多分変なデータが入ってたと思う。
  • nkf -Ewも試してみたけど、こっちはだめだった。多分おかしいデータのフィルタリングができないから?
  • ちなみにubuntuでiconvをインストールしたい場合はapt-get install unicode。apt-get install iconvじゃない。
  • 何故か文字コード変換したdumpをmysqlに読ませると、"Got a packet bigger than ‘max_allowed_packet’ bytes"というエラーが出る。

対策は、http://houseoflaudanum.com/navigate/howtos/got-a-packet-bigger-than-max_allowed_packet-bytes-mysql-error/ にある通り、

# mysql -u admin -p
mysql> set global net_buffer_length=1000000;
Query OK, 0 rows affected (0.00 sec)
mysql> set global max_allowed_packet=1000000000;
Query OK, 0 rows affected (0.00 sec)

した後に、

$ cat dump | /usr/local/tritonn/bin/mysql -u root cms2ch --max_allowed_packet=16M --default-character-set=utf8

  • 何故かこのページのデータ http://copipe.cureblack.com/copipe/2010/02/15/14312 だけが変なデータがあったため、一行だけdeleteしてやり直した
  • php側はeucを使っている
  • my.cnfでinit-connect SET NAMES ujisだと何故か正しくエンコーディングが変換されない
  • mysql_set_charset("ujis")なら直る。
  • Ethnaで使われているDBライブラリのPEAR::DBはcharsetの変更をサポートしていない
  • どうせDBは一つしかないし、面倒くさいからPEAR::DBを直接書き換えることにした。ファイルは/usr/share/php/DB/mysql.php。バージョン1.7.13らしい。

if (!$this->connection) {
if ( ($err = @mysql_error() ) != '') {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$err);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
}

//ここに加える
mysql_set_charset("ujis");

これで切り替え完了。

あとはfulltext indexの作成と、スクリプト側でlike %foo%みたいなコードをmatch againstに書き換えるだけ。

結構しんどかったなぁ...。

*1:この初回のfulltext indexは何故か無指定なのにmecabになってた。後でもう一度ngramと明示的に指定してやったけど、これは数時間経っても終わらなかった。