Estoy usando Postgres 9.5 y tengo una columna ("info") de tipo 'json'... Estoy tratando de hacer esta inserción:
INSERT INTO table ( info ) VALUES ( '{"entry":"((\+)[0-9]+)"}' )pero me sale este error:
ERROR: invalid input syntax for type json DETAIL: Escape sequence "\+" is invalid. Está interpretando \+ como una secuencia de escape, pero en realidad quiero eso como parte de mi valor.
En general,
jsonb_build_object para construir el objeto\ .PostgreSQL no cita esto: es solo la implementación de JSON después de RFC 7159 .
Una cadena comienza y termina con comillas. Todos los caracteres Unicode se pueden colocar entre comillas, excepto los caracteres que se deben escapar: comillas, sólido inverso y los caracteres de control (U+0000 a U+001F). [... ] Entonces, por ejemplo, una cadena que contiene solo un único carácter solidus inverso puede representarse de manera más compacta como
"\\".
Entonces se ve así en la forma literal.
CREATE TABLE tbl AS SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;La cotización de dólares en PostgreSQL no requiere escapes, pero no ayudará aquí,
Tenga en cuenta que dentro de la cadena cotizada en dólares, se pueden usar comillas simples sin necesidad de escapar. De hecho, ningún carácter dentro de una cadena cotizada en dólares nunca se escapa : el contenido de la cadena siempre se escribe literalmente. Las barras invertidas no son especiales, ni tampoco los signos de dólar, a menos que formen parte de una secuencia que coincida con la etiqueta de apertura.
Entonces esto no funcionará porque \+ no es una cadena válida en JSON. Sin embargo, funcionaría si no estuviéramos usando un tipo 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":"\"} Sin embargo, puede usar to_jsonb() para escapar de JSON de las cadenas.
SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb FROM ( VALUES ('key', '\' ) ) AS t(k,v); Pero incluso esto es una mala idea porque si tiene las claves y los valores, puede usar json_build_object ,
SELECT jsonb_build_object( k, v ) FROM ( VALUES ('key', '\' ) ) AS t(k,v);