当ブログのおすすめ記事はこちら!
  • 【学生でもできる】エンジニアとして海外ノマドワークをする方法と実際に感じたこと

【SQL】MySQLでクエリ内の数値にシングルクォーテーションを使うとどうなるのか

SHARE

【SQL】MySQLでクエリ内の数値にシングルクォーテーションを使うとどうなるのか



こんにちはTakumi(@ynwa_ynwa_0826)です。

突然ですがSQLを書くときにあなたは数値にシングルクォーテーションをつけていますか?

SELECT * from table where id = 1

SELECT * from table where id = '1'

このときの違いについて意識したことはありますか??僕はなかったです。でもこれを意識しないとちょっとまずいことがあるとわかったのでこの記事をかいているわけです。

結論から言うとシングルクォーテーションをつけるとMySQLは暗黙の型変換を行います。

これが思わぬ事故を発生することになるのでその事例を紹介します。

SELECTの際にwhere句で絞っていても反応がない

select * from table where columnA = '6.81'

columnAの型はdouble(6,2)となっています。
tableの中にはすでにcolumnAが6.81のデータは格納されています。(select * from tableだと問題なく取得可能です)

しかし!上のクエリだと一切の反応がなく
、nullとなってしまっておりました。
これは一体なぜ????

型変換が勝手におきて想定外の動きをしている

↑が想定されます。ちなみに

select * from table where columnA = 6.81

だと6.81がdouble型として認識されて問題なく動くのです。

このあとカラムの型をdecimalに変更すると、シングルクォーテーションをつけたものと同じ挙動をするようになりました。

よってシングルクォーテーションを使うのは若干危険があるときがあります。

SQLの安全性を考えるとシングルクォーテーションは必要。。。

シングルクォーテーションをつけない場合、SQLのwhere句に直書きをすることになります。これはSQLインジェクションの脆弱性をもっていて危険が発生してしまいます。。。

実際そのあたりを考慮したLaravelのクエリビルダの書き方は自動的にシングルクォーテーションがつくようになっています。

なのでつけないわけにもいかないのですが、、、つけると危険もあるのです。

よって気をつけないといけないことは

・シングルクォーテーションをつけると暗黙の型変換がおきてしまうことを意識
・DBの型を適当につけないこと(今回だとdoubleにするのかdecimalにするのか)

ちょっとむずかしい問題でまだ未解決の感じです。また加筆していこうと思います



スポンサードリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です