У меня есть данные JSON, хранящиеся в столбце JSON (не JSONB) в моей базе данных postgresql (9.4.1). Некоторые из этих структур JSON содержат последовательности Unicode в их значениях атрибутов. Например:Обработка последовательностей Unicode в postgresql
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }
При попытке запросить этот столбец JSON (даже если я непосредственно не пытается получить доступ к атрибуту device_name
), я получаю следующее сообщение об ошибке:
ERROR: unsupported Unicode escape sequence
Detail:\u0000
cannot be converted to text.
Вы можете воссоздать эта ошибка, выполнив следующую команду на сервере PostGreSQL:
select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'
ошибка имеет смысл для меня - там просто нет способа, чтобы представить последовательность Юникода NULL
в текстовом виде.
Можно ли мне запросить одни и те же данные JSON без необходимости выполнять «санитарию» по входящим данным? Эти структуры JSON меняются регулярно, поэтому сканирование определенного атрибута (device_name
в этом случае) не будет хорошим решением, поскольку могут быть другие атрибуты, которые могут содержать похожие данные.
После еще нескольких исследований, кажется, что это поведение является новым для версии 9.4.1, как mentioned in the changelog:
...Therefore
\u0000
will now also be rejected in json values when conversion to de-escaped form is required. This change does not break the ability to store\u0000
in json columns so long as no processing is done on the values...
Было ли это действительно намерение? Является ли понижение до 9.4.1 жизнеспособным вариантом здесь?
Как примечание стороны, это свойство берется от имени мобильного устройства клиента - это пользователь, который вошел в этот текст в устройство. Как на самом деле пользователь ввел NULL
и REPLACEMENT CHARACTER
значения ?!
Для справки, это не только случай с 'SELECT' - я получаю такую же проблему с SQL' UPDATE' заявление на 9.5 и 9.6. –