webネタ

技術系ブログ。web系SE。1988。♂。@rhong_

MySQLを正しくUTF8化する方法

追記

http://d.hatena.ne.jp/R-H/20120106/1325837092
に書きましたが、このYumリポジトリを使えばデフォルトでUTF8になってるので大丈夫です。

前置き

MySQLのデフォルト文字エンコーディングはlatin1です。なのでutf8化するにはmy.cnfに設定を加えたりします。

default-character-set = utf8
skip-character-set-client-handshake

を加えないとutf8化できません。
ですが『mysql skip-character-set-client-handshake』とかでググるskip-character-set-client-handshakeは使わないほうがいいという記事がいっぱいでてきますね。

正しい方法

自分でビルドしてください。
最近のMySQLだとcmakeみたいです。オプションを見るとcharasetの設定があります。
デフォルトはちゃんとlatin1になってますね!これをutf8にすればいけるはず。

ビルド

最近のMySQLはRPMが用意されているんですね!そしてちゃんとSRPMも置いてありました。
じゃあSRPMを展開してspecを書き換えればokですね。
SRPMhttp://dev.mysql.com/downloads/mysql/のSourceCodeを選択した先にあります。
最新版は5.5.18ですか!今回は一番上のGenericを選択。
同じ人は直りん
f:id:R-H:20111130235255p:image

ダウンロードしたら展開。

mkdir mysql-5.5.18 && cd mysql-5.5.18
rpm2cpio ./mysql-*.src.rpm | cpio -i

specを書き換える。

vi mysql.5.5.18.spec

以下が2箇所あるので、

 -DMYSQL_SERVER_SUFFIX="%{server_suffix}"

一つ前に追加してこうします。

 -DDEFAULT_CHARSET=utf8 \
 -DDEFAULT_COLLATION=utf8_general_ci \
 -DMYSQL_SERVER_SUFFIX="%{server_suffix}"

2箇所同じように書き換えたら、保存します。

そしてrpmビルド用のディレクトリにtarを移します。

mv mysql-5.5.18.tar.gz ~/RPM/SOURCES

もし~/RPM/SOURCESがない人はrpmbuildでぐぐること。

ここまでできたら、あとはビルドするだけです。

rpmbuild -bb ./mysql.5.5.18.spec

ビルドし終わったら、~/RPM/RPMS/`arch`/以下にRPMができてますので、インストールしてください。

確認

my.cnfにutf8の設定がないことを確認して...

mysql> SHOW VARIABLES LIKE 'char%';
 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
 8 rows in set (0.01 sec)
mysql> SHOW VARIABLES LIKE 'collation%';
 +----------------------+-----------------+
 | Variable_name        | Value           |
 +----------------------+-----------------+
 | collation_connection | utf8_general_ci |
 | collation_database   | utf8_general_ci |
 | collation_server     | utf8_general_ci |
 +----------------------+-----------------+
 3 rows in set (0.00 sec)

できたできた(´ω`。
phpからも一応ためしたが大丈夫だった。

まとめ

rpm配布しようと思ったけどやめました。
さくらVPSで使う最新のapachephpなんかは自分でrpmビルドしたものがあるので、さくらVPS用最新ミドルウェアリポジトリとして公開しようと思ってます。
remiとか微妙にバージョン古いからなぁ。。