こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Postgreresqlで「 \ 」が打てない

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

投稿日時 - 2017-05-03 00:01:49

QNo.9324602

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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

投稿日時 - 2017-05-03 00:13:50

あなたにオススメの質問