postgresql の文字列リテラルとエスケープ文字
-
08-06-2019 - |
質問
テーブルにエスケープ文字を挿入しようとすると、警告が表示されます。
例えば:
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 の使用)
これを回避する方法を知っている人はいますか?
解決
部分的に。テキストは挿入されますが、それでも警告が生成されます。
テキストの前に「E」を付ける必要があるというディスカッションを見つけました。
insert into EscapeTest (text) values (E'This is the first part \n And this is the second');
これにより警告は抑制されましたが、テキストは依然として正しく返されませんでした。マイケルの提案に従ってスラッシュを追加したところ、うまくいきました。
そのような:
insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
他のヒント
いいね。
E に関するドキュメントも見つかりました。
http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS
PostgreSQL は、SQL 標準の拡張機能である「エスケープ」文字列定数も受け入れます。エスケープ文字列定数は、開始の一重引用符の直前に文字 E (大文字または小文字) を書くことによって指定されます。えーふー。(複数行にわたってエスケープ文字列定数を続ける場合は、最初の引用符の前にのみ E を記述します。) エスケープ文字列内では、バックスラッシュ文字 (\) で C のようなバックスラッシュ エスケープ シーケンスが始まります。バックスラッシュと後続の文字( s) は特殊なバイト値を表します。\b はバックスペース、\f はフォーム フィード、 は改行、 はキャリッジ リターン、 はタブです。また、8 進数のバイト値を表す \digitals、および 16 進数のバイト値を表す \xhexdigits もサポートされます。(作成するバイト シーケンスがサーバーの文字セット エンコーディングで有効な文字であるかどうかは、ユーザーの責任です。) バックスラッシュに続くその他の文字は文字通りに解釈されます。したがって、バックスラッシュ文字を含めるには、2 つのバックスラッシュ (\\) を記述します。また、エスケープ文字列に一重引用符を含めるには、通常の '' 以外に \' を記述することもできます。
文字列にバックスラッシュを使用しているため、警告が発行されます。このメッセージを回避したい場合は、「set standard_conforming_strings=on;」コマンドを入力してください。次に、postgresql で解釈したいバックスラッシュを含む文字列の前に「E」を使用します。
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=>
本当に愚かな質問:指定した改行位置で文字列が切れているだけでなく(おそらくインターフェイスに表示されていない)、文字列が切り詰められていることを確認していますか?つまり、フィールドが次のように表示されることを期待していますか?
これは挿入されます nこれは
または
これが挿入されます
これはありません
また、どのようなインターフェイスを使用していますか?途中で何かがバックスラッシュを食い荒らしている可能性はありますか?