postgresqlの文字列リテラルとエスケープ文字


113

エスケープ文字をテーブルに挿入しようとすると、警告が表示されます。

例えば:

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

警告を生成します:

WARNING:  nonstandard use of escape in a string literal

PSQL 8.2を使用

誰でもこれを回避する方法を知っていますか?

回答:


131

部分的に。テキストは挿入されますが、警告は引き続き生成されます。

そのため、テキストの前に「E」を付ける必要があることを示すディスカッションが見つかりました。

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

これにより警告は抑制されましたが、テキストはまだ正しく返されていませんでした。Michaelが提案したようにスラッシュを追加したところ、うまくいきました。

など:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');

5
PostgreSQL 9.0では、E'testing \\ x20double-slash 'は' testing \\ x20double-slash 'と評価されるため、E'string'スタイルのリテラルではシングルスラッシュアプ​​ローチのみが機能することに注意してください
Alexander

2
:PostgreSQLの9.2を参照してくださいpostgresql.org/docs/9.2/interactive/...
ピット

psql \copy注:psqlの「\ copy」メタコマンドのクエリ引数で使用すると、改行ではなくE'\n'ファイルに書き込まれたことがわかりました'\n'
2015

40

涼しい。

Eに関するドキュメントも見つかりました。

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQLは、SQL標準の拡張である「エスケープ」文字列定数も受け入れます。エスケープ文字列定数は、最初の単一引用符の直前に文字E(大文字または小文字)を書き込むことによって指定されます(例:E'foo ')。(エスケープ文字列定数を複数の行にまたがる場合は、最初の引用符の前にのみEを記述します。)エスケープ文字列内では、バックスラッシュ文字(\)がCのようなバックスラッシュエスケープシーケンスを開始します。 s)は特別なバイト値を表します。\ bはバックスペース、\ fはフォームフィード、\ nは改行、\ rはキャリッジリターン、\ tはタブです。\ digits(数字は8進バイト値を表す)と\ xhexdigits(16進数字は16進バイト値を表す)もサポートされています。(作成するバイトシーケンスがサーバーの文字セットエンコーディングで有効な文字であるかどうかはユーザーの責任です。)バックスラッシュに続くその他の文字は文字どおりに解釈されます。したがって、バックスラッシュ文字を含めるには、2つのバックスラッシュ(\\)を記述します。また、通常の ''の方法に加えて、\ 'と書くことにより、単一引用符をエスケープ文字列に含めることができます。


6

文字列でバックスラッシュを使用しているため、警告が発行されます。メッセージを避けたい場合は、このコマンド「set standard_conforming_strings = on;」を入力してください。次に、postgresqlに解釈させたいバックスラッシュを含む文字列の前に「E」を使用します。


1
あんまり。standard_conforming_strings = onを指定してコマンドを実行すると\copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f'、が取得されparse error at "'\x7f'"ます。standard_conforming_strings = off;がある場合 Eと引用符なしで上記と同じコマンドを使用します...(DELIMITER AS \ x7f)警告メッセージが表示されますが、データは正常に読み込まれます。したがって、ステートメントは正しいかもしれませんが、この場合は正しくありません。

私はSQLステートメントで文字列を参照していましたが、現在はpsqlコマンドを使用しています。\ copyの代わりにCOPYコマンドを使用しても同じエラーが発生しますか?
eppesuig

1
これが正解です。PGの最新バージョンでは、デフォルトでオンになっています。
jpmc26 2017年

3

Postgresが入力時にデータを切り捨てる可能性は非常に低いと私は思います。拒否するか、そのまま保存します。

milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

私が与えたテストケースを試してみてください、あなたはそれをあなた自身で見るでしょう。
rjohnston 2008

問題のような興味深い、ルックスは、テキストがデータベースから出てくるので、非常に間違いなく...切り捨てられた後、JDBCドライバにあった
rjohnston

3
Postgres 、非常に特殊な状況では、入力時にデータを切り捨てます。たとえばcharacter varying(4)、入力 "test"(単語の後に2つのスペース、6文字)が指定された列では、スペースが切り捨てられ、値 "test"が格納されます。ただし、一般的なルールとして、Postgresはデータを切り捨てるのではなくエラーが発生すると想定できます。
ブライソン

0

本当にばかげた質問:文字列が切り捨てられ、指定した改行で改行されていない(そしておそらくインターフェイスに表示されていない)ことを本当に確信していますか?つまり、フィールドが次のように表示されることを期待していますか

これは挿入されます\ nこれは挿入されません

または

これが挿入されます

これはありません

また、どのインターフェースを使用していますか?途中で何かがバックスラッシュを食べている可能性はありますか?


1
これは私に起こりました。テキストがテキストボックスに挿入され、ソースが表示され、確かに引用があり、テキスト全体が表示されていましたが、表示されていませんでした
roberthuttinger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.