日本語 INSERT 時に Warning (Code 1366): Incorrect string value: ... が出る問題

 ある Schema では問題無く INSERT が出来るのに別の Schema では文字化けすると言う良く解らない現象に数時間悩まされたが、私の場合は character_set_database が latin1 のままだったことが原因だった。

★ 悪い例

> show variables like 'character\_set\_%';
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+

 character_set_database が latin1 になっていて、この時は挿入時に日本語がみんな「?」になってしまう。

★ 良い例

> show variables like 'character\_set\_%';
+--------------------------+--------+
| 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   |
+--------------------------+--------+

★ 解決策

 Schema を作る前なら /etc/my.cnf の [mysqld] セクションに default-character-set=utf8 を追加しておくなどすれば良いのだが、そうで無かった場合はどうするのやら。http://fg-180.katamayu.net/archives/2006/09/22/023614 では dump してもう一度作り直したそうだけど、私は一度 Drop して作り直して解決した。既存のデータベースの character_set_database は変更できるのかな?まだ調べて無いけど。