• 締切済み

Postgreresqlで「 \ 」が打てない

PostgreresqlのSQLshellで、半角バックスラッシュ(\)を入力すると、アンダースコア( _ )に自動変換されてしまって入力できません。そのため、SQLshellで「\q」などのバックスラッシュを伴うコマンドが認識されません。  ただ、ターミナルやその他のアプリケーション内では、バックスラッシュの入力ができます。つまり、SQLshell内のみで入力ができない状態です。  文字エンコードの問題かなとも思いますが、うまい具合に解決できずに困っています。ご回答宜しくお願いします。  また開発環境は、MacOSでELcapitaを使用し、PostgresSqlは9.6を使用しています。

みんなの回答

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.1

PostgreSQLの文字列リテラルでは、バックスラッシュ文字の意味が standard_conforming_stringsという設定によって変わるようです。 standard_conforming_stringsが"off"のときは、バックスラッシュは特殊文字として 機能します。「\n」はAscii文字のLFで、「\t」はTABとして解釈されます。 一方、standard_conforming_stringsが"on"のときは標準SQL仕様準拠モードとなり、 バックスラッシュはただの「バックスラッシュという文字そのもの」として解釈されます。 「\n」は「\」と「n」の2文字となります。 このあたりことは以下のページの方が詳しいですのでそちらをどうぞ。 PostgreSQLは標準でバックスラッシュをエスケープしない仕様になった | 徳丸浩の日記 元々、標準のSQL仕様的には、バックスラッシュは特殊文字扱いしないのが正解とのことで、 PostgreSQLはその標準仕様に従うようにしたとのことです。 そうなると、標準SQL仕様としては文字列中にLFやTABを記載したいときにはどうするのが筋なんでしょうか? 調べても公式っぽい文書を見つけられなかったのですが、どうやらCHR()関数を使うことになるようです。 select 'hoge' + CHR(10)/* CR */ + 'fuga' + CHR(9) /* TAB */ http://qiita.com/namutaka/items/684d1f1950db4dc24d62