スキップしてメイン コンテンツに移動

SQLのエスケープ処理

SQLのエスケープ処理


検索文字列のエスケープ

使用DBMS:MySQL

where句などで、シングルクオートを指定したいときのエスケープ。 たとえば「The Tom’s house」のように所有の「s」の前のアポストロフィーなど。

MySQLのドキュメントからエスケープする方法は以下のようなものがあります。

  • 「’’」と記述する
SELECT * FROM post p WHERE p.title = 'Tom''s house';
  • バッククォート「」を直前に書く
SELECT * FROM post p WHERE p.title = 'Tom\'s house';
  • 文字列を「“」で囲む
SELECT * FROM post p WHERE p.title = "Tom's house";

カラムにハイフンが含まれるとき

多分、そもそもカラム名やテーブル名にハイフンを含めないのが望ましいと思いますが、ハイフンを含まざるをえない時、以下のようなSQLを投げたらエラーが発生しました。

ALTER TABLE post ADD post-white-list VARCHAR(255);

エラーメッセージ

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘post-white-list’…

カラム名をダブルクオートで囲ってみる

ALTER TABLE post ADD "post-white-list" VARCHAR(255);

同じエラーが出る。。

解:バッククオートで囲む

以下のようにバッククオートで囲んだら実行できました。

ALTER TABLE post ADD `post-white-list` VARCHAR(255);

バッククオートは予約語をエスケープするものだと思っていて、あまり使う機会がなかったのですが、このような時も使えるんですね。

JSON値を検索する関数でハイフン入りの文字列を使うとき

JSON系の関数でターゲットのキーにハイフンを含むとき、以下のように書くと同様にエラーになります

JSON_UNQUOTE( JSON_EXTRACT( json, '$.post-white-list' ) )

この場合は以下のようにキーをダブルクオートで囲って書き換えるとエラーが解消されました。

JSON_UNQUOTE( JSON_EXTRACT( json, '$."post-white-list"' ) )

案外SQLのエスケープって大変だなと感じました。

コメント