MySQLの暗黙の型変換でUPDATE文がエラーになった

MySQLの暗黙の型変換でUPDATE文がエラーになった

こんにちは。

最後に更新してから半年ほど時間が空いてしまいましたが、またブログを再開したいと思います。

今回は軽めのやつで、MySQLの暗黙の型変換で知らない挙動に遭遇したのでご紹介したいと思います。

エラーになったパターン

MySQLのテーブル設計をする時に、複数の値をカンマ区切りでテキストとして保持したいケースが稀にあると思います。

勿論、綺麗にテーブルを分けてリレーションを張るのもよいのですが、そこまでする必要がないケースですね。

例えば、商品(item)と関連するタグ(tag)があったとします。 商品にタグは複数設定することができる場合、タグテーブルのidをカンマ区切りで保持したいというケースで考えてみます。

table: item
 id int
 name varchar(100)
 tag_id_list varchar(100)

table: tag
  id int
  name varchar(100)

MySQLでは暗黙の型変換があるため、タグid:1のみが設定されている商品を取得したい場合

SELECT *
FROM item
WHERE tag_id_list = 1 ;

というクエリが成功します。

tag_id_list はvarcharで定義されているため、厳密には

SELECT *
FROM item
WHERE tag_id_list = '1' ;

としてあげるのがよいですね。

一方、UPDATE文を発行する場合、例えばタグid:1のみが設定されているもの全てにタグid:2も追加するというクエリを発行したい場合、

UPDATE item
SET tag_id_list = '1,2'
WHERE tag_id_list = 1 ;

とするとエラーになります。

この場合は、

UPDATE item
SET tag_id_list = '1,2'
WHERE tag_id_list = '1' ;

とWHERE句の部分で文字列として、指定する必要があります。

最後に

今回はかなり初歩的な内容ですが、暗黙の型変換によって意図しない挙動が生まれてしまうことについて書きました。

暗黙的に型を変換してくれるプログラミング言語も同様ですが、型についてと言語仕様を知っておかないと思わぬバグが生まれてしまうことがあります。

この辺はしっかりと把握しておきたいですね。