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のエスケープって大変だなと感じました。
コメント
コメントを投稿