Home > pgsql > シングルクォートのエスケープ

シングルクォートのエスケープ

PostgreSQL 8.1のマニュアルを眺めていて目を疑った。

PostgreSQLでは、また、単一引用符をバックスラッシュでエスケープすること(\')ができます。しかし、今後のPostgreSQLのバージョンではこれはできなくなる予定です。ですので、バックスラッシュを使用するアプリケーションを上述の標準に準拠するように変更しなければなりません。
(4.1.2.1. 文字列定数 より)
現在のPostgreSQLは文字列リテラル内のバックスラッシュを、特別なエスケープシーケンスの始まりとして扱います。例えば、\nや\010です。これで簡単に特別な値を埋め込むことができますが、非標準であり、他のデータベースからのアプリケーションの移植を困難にしています。このため、PostgreSQLプロジェクトでは、文字列内のバックスラッシュが特別な意味を持たないようにすることを計画しています。後方互換性と、特別なバックスラッシュ処理を使用したいユーザのために、新しい文字列構文を作成しました。
(リリースノート より、太字は石田による)

エーまじですか。詳細はドキュメントを確認してほしいが要するに、文字列中のシングルクォートをバックスラッシュでエスケープするのは将来的にはやめる。互換性のために8.1からは、E'文字列'という文字列構文と、standard_conforming_strings、escape_string_warningという設定パラメータを導入した。ということらしい。まあ当面は問題無いだろうけど混乱しそうだなぁ。

というわけで、PHPなんかで文字列のエスケープにaddslashes()ではなくpg_escape_string()を使うようにしましょう(とはいえクライアント側のlibpqのバージョンが古かったらどうなるんだろうとか)。データベース抽象化レイヤとか書く人が大変そう。

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/pgsql/051217_addslash.trackback

Page Top