裏MySQLクエリー入門(13) 基礎編10 MySQLの自動型変換
前回の裏MySQLクエリー入門(13) でINT型のprogram_idとVARCHAR型でprogram_idがカンマ区切りのprogram_idsを結合すると一見すると動作しているよう*1に見えます。
SELECT * FROM `platform` pf, `program` pg WHERE pg.program_id = pf.program_ids
platform_id | platform_name | program_ids | program_id | program_name |
---|---|---|---|---|
1 | Windows | 1,2,3 | 1 | JAVA |
2 | Linux | 1,2,3 | 1 | JAVA |
3 | Mac OS X | 1,2,3,4 | 1 | JAVA |
5 | Android | 1,2 | 1 | JAVA |
4 | iphone | 4 | 4 | Objective-C |
ですが、結果はご覧の通りです。何が起こったかというとMySQLは自動型変換が行われるため、program_idsの先頭の数字文字だけが数字とみなされ、その値と結合されたというわけです。program_idsが1つの値のみの場合は正常に見えてしまいます。MySQLの自動型変換は大変便利なのですが、この事例以外にも、知らず知らずのうちに自動型変換が行われていてパフォーマンスが著しく低下していることがあるので注意しましょう。特に時刻型と文字列型は自動変換されていることに気がつかないことが多いので注意が必要です。ちなみにOracleとかだとちゃんと型変換を明示する必要があります。
詳しくは、sakaikさんのこれだけは覚えておきたい!!MySQL の6つの自動変換の参考にしてください。