string - 関数 - postgresql 禁止文字




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

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=>

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

例えば:

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に関する文書を見つけました:

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

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


本当にばかげた質問:あなたは文字列が切り捨てられていること、そしてあなたが指定した改行でただ壊れていないことを確認していますか? つまり、フィールドは次のように表示されると思いますか。

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

または

これが挿入されます

これはされません

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


部分的に テキストは挿入されますが、それでも警告は生成されます。

私は、テキストの前に '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');




escaping