Postgres 9.5を使用していて、タイプ 'json'の列( "info")があります...この挿入を実行しようとしています:
INSERT INTO table ( info )
VALUES (
'{"entry":"((\+)[0-9]+)"}'
)
しかし、私はこのエラーを受け取ります:
ERROR: invalid input syntax for type json
DETAIL: Escape sequence "\+" is invalid.
これ\+
はエスケープシーケンスとして解釈されますが、実際にはそれを自分の価値の一部として望んでいます。
一般に、
jsonb_build_object
オブジェクトの構築に使用するキーと値がある場合\
です。PostgreSQLはこれを引用されていません:それはちょうど次のようなJSON implimentationだRFC 7159。
文字列は引用符で始まり、引用符で終わります。エスケープする必要のある文字(引用符、円記号、および制御文字(U +0000からU + 001F))を除き、すべてのUnicode文字を引用符で囲むことができます。[...]したがって、たとえば、単一の逆スラッシュ文字のみを含む文字列は、よりコンパクトにとして表すことができます
"\\"
。
したがって、文字通りの形式ではこのようになります。
CREATE TABLE tbl
AS
SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;
PostgreSQLでのドル見積もりにはエスケープは必要ありませんが、ここでは役に立ちません。
ドル引用符で囲まれた文字列内では、エスケープする必要なしに一重引用符を使用できることに注意してください。実際、ドルで引用された文字列内の文字がエスケープされることはありません。文字列の内容は常に文字通りに記述されます。バックスラッシュは特別なものではなく、開始タグに一致するシーケンスの一部でない限り、ドル記号でもありません。
したがって、はJSONで有効な文字列ではないため、これは機能しません\+
。ただし、jsonタイプを使用していなくても機能します。
SELECT '{"key":"\"}'::jsonb;
ERROR: invalid input syntax for type json
LINE 1: SELECT '{"key":"\"}'::jsonb;
^
DETAIL: Token ""\"}" is invalid.
CONTEXT: JSON data, line 1: {"key":"\"}
ただし、を使用to_jsonb()
して文字列をJSONエスケープすることができます。
SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb
FROM ( VALUES
('key', '\' )
) AS t(k,v);
しかし、これでも悪い考えです。なぜなら、キーと値があれば、を使用できるjson_build_object
からです。
SELECT jsonb_build_object( k, v )
FROM ( VALUES
('key', '\' )
) AS t(k,v);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加