これらをエスケープして同様の文字列を表示したいとします
SELECT *
FROM ( VALUES
(E'\r\n\t FOO BAR \t\n\r')
) AS t(str);
Cスタイルのエスケープを取得するにはどうすればよいですか、\r\n\t FOO BAR \t\n\r
バックアウトしますか?
SELECT *
FROM ( VALUES
(E'foo\nfoo',E'\n\tBAR\t','baz'),
(E'quz','qaz','quz')
) AS t(x,y,z);
x | y | z
-----+------------------+-----
foo+| +| baz
foo | BAR |
quz | qaz | quz
(2 rows)
代わりにしたい.
x | y | z
----------+------------------+-----
foo\nfoo | \n\tBAR | baz
quz | qaz | quz
(2 rows)
以下のように、文字列エスケープ構文とreplace(string,substring,replacement)
関数を使用できます。
standard_conforming_strings
の設定に大きく依存していることに注意してください。 on
である必要があります。詳細は here 、 here および here です。
postgres=# \d t
Table "public.t"
Column | Type | Modifiers
--------+------+-----------
s | text |
postgres=# SELECT s, md5( s ), replace( replace( replace( s, E'\n', '\n' ), E'\t', '\t' ), E'\r', '\r' ) FROM t;
s | md5 | replace
----------+----------------------------------+------------
newline:+| 75c093ed14f1239a3510006326a1a260 | newline:\n
| |
tab: | 355393c5cab9aa324c6ec90682b13d7e | tab:\t
cr:\r | 094911687582e40cfeb6217f8c760543 | cr:\r
(3 rows)
postgresqlはこれを行っていません。あなたはpsqlによってあなたに表されているようにデータを見ています。
しかし、バイトを表示したい場合は、データをバイトに変換し、それを見てください。
jasen=# set bytea_output to escape;
jasen=# SELECT
convert_to(x,'utf8') as x_bytes,
convert_to(y,'utf8') as y_bytes,
convert_to(z,'utf8') as z_bytes
FROM ( VALUES
(E'foo\nfoo',E'\n\tBAR\t','baz'),
(E'quz','qaz','quz')
) AS t(x,y,z);
x_bytes | y_bytes | z_bytes
------------+-----------------+---------
foo\012foo | \012\011BAR\011 | baz
quz | qaz | quz