PostgreSQLで「'」(シングルクォーテーション/単一引用符)をエスケープ処理する方法
PostgreSQLで「'」(シングルクォーテーション/単一引用符)をエスケープ処理する方法を以下にメモしておく。
■SQLの実行に失敗する例
insert into nobuneko_dictionary (dic_name,dic_name2) values ('Foundation's Edge','ファウンデーションの彼方へ');
このSQLを実行すると、以下のようなエラーメッセージが表示される。
ERROR: syntax error at or near "s"
LINE 3: ...ictionary (dic_name,dic_name2) values ('Foundation's Edge','...
^
********** エラー **********
ERROR: syntax error at or near "s"
SQLステート:42601
文字:112
「Foundation's Edge」を「'」(シングルクォーテーション/単一引用符)で囲んでいるのだが、その囲んだ中に「'」がそのままあることがエラーの原因。エラーを回避し、SQLの実行を成功させるには、「'」をエスケープ処理する必要がある。
■SQLの実行に成功する例1
insert into nobuneko_dictionary (dic_name,dic_name2) values ('Foundation''s Edge','ファウンデーションの彼方へ');
※「'」の前に「'」を付ける。
つまり、「'Foundation's Edge'」を「'Foundation''s Edge'」とする。
■SQLの実行に成功する例2
insert into nobuneko_dictionary (dic_name,dic_name2) values (E'Foundation\'s Edge','ファウンデーションの彼方へ');
※「E'...\'...'」のように文字列を囲む「'」の前に「E」(大文字でも小文字でもよいらしい)を付け、囲まれた文字列の中にある「'」の前には「\」(Windowsなら半角の¥マーク、Linuxならバックスラッシュ)を付ける。
つまり、「'Foundation's Edge'」を「E'Foundation\'s Edge'」とする。
■SQLの実行に成功するがエラーが表示される例
insert into nobuneko_dictionary (dic_name,dic_name2) values ('Foundation\'s Edge','ファウンデーションの彼方へ');
※上記の「SQLの実行に成功する例2」との違いは、文字列を囲む「'」の前に「E」を記述しないこと。
この例の場合、SQLの実行には成功するが、以下のエラーメッセージが表示される。
WARNING: nonstandard use of \' in a string literal
LINE 4: ... nobuneko_dictionary (dic_name,dic_name2) values ('Foundatio...
^
HINT: Use '' to write quotes in strings, or use the escape string syntax (E'...').
クエリーは、成功しました: 1 行の影響があり, 実行時間は、16 ミリ秒でした。
このエラーメッセージによると、「\'」といった書き方は非標準とのこと。
ヒント(HINT)を参考にすると、「'」をエスケープする場合は、「\'」ではなく、「''」のように「'」を2つ連続で記載するか、「E'...\'...'」とすればよいようだ。