PostgreSQL:バックスラッシュの扱い
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 か $$~$$ で対応することとなります。