PostgreSQL:バックスラッシュの扱い

最終更新日時:2011-11-25 13:56:26
PostgreSQL

概要


PostgreSQL では、文字列中のバックスラッシュはエスケープ文字として使われます。
これは PostgreSQL 独自の仕様で、これが原因でトラブルが発生する可能性があります。

例えば Shift-JIS の場合が顕著で、Shift-JIS ではバックスラッシュ(0x5c)に相当する文字が2バイト文字の2バイト目に表れることがあり(まさに「表」という時がそれだったり(笑))、これを PostgreSQL ではエスケープ文字として判断してしまうことにより、想定外の動作となってしまいます。

従って、PostgreSQL では、バックスラッシュの扱いについては注意を必要とします。

standard_conforming_strings


postgresql.conf で standard_conforming_strings という設定項目があります。
※ 8.1 以降から出来た模様

これを on にすると、バックスラッシュのエスケープが無効となり、off にするとエスケープが有効となります。
9.1 以降では on がデフォルト。それ以前は off がデフォルトとなるので、この設定もトラブルの原因となりやすいものの1つとなります。
特に、9.1 以前から 9.1 以上へバージョンアップする際には要注意ですね。

エスケープを明示的に無効とする


standard_conforming_strings の on/off により、バックスラッシュのエスケープの有効/無効は切り替えられますが、これは PostgreSQL 全体に効いてしまう有効なので、影響が大きすぎる場合があります。
そのような場合には、エスケープを明示的に無効にしたい箇所を「$$~$$」で囲むことにより、個別にエスケープを無効にできます。

 UPDATE xxxx set field1=$$エスケープしたくない文字列$$;


バックスラッシュに限らず、"'" を文字列に含めたい時にも便利ですね。

WARNING: nonstandard use of escape in a string literal


このような警告が出ることがあります。
これは、バックスラッシュをエスケープ文字として使用した際に出る警告です。
警告ですので、エラーになるわけではなく、処理は実行されます。
従って、正常に処理が実行されたのであれば、この警告は気にする必要はありません。
もし、警告が気になるのであれば、'文字列' の前に「E」を付与して明示的にエスケープ
することを指定することにより、回避できます。

しかしながら、例えば、DB のエンコーディングが SQL_ASCII で Shift-JIS の文字列を使い、その中に意図しないバックスラッシュのコード(0x5c)が含まれているというパターンの場合にも上記の警告が表示されます。
この場合には、正常に登録されず、おそらくは文字化けした状態か、もしくはエラーとなりますので、前述した standard_conforming_strings か $$~$$ で対応することとなります。

お問い合わせは 掲示板 にて。