У меня есть данные JSON, хранящиеся в столбце JSON (не JSONB) в моей базе данных postgresql (9.4.1). Некоторые из этих структур JSON содержат последовательности Unicode в их значениях атрибутов. Например:
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }
Когда я пытаюсь запросить этот столбец JSON (даже если я не пытаюсь напрямую получить доступ к атрибуту device_name
), я получаю следующую ошибку:
ОШИБКА: неподдерживаемая escape-последовательность Unicode
Деталь:\u0000
не может быть преобразован в текст.
Вы можете восстановить эту ошибку, выполнив следующую команду на сервере postgresql:
select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'
Ошибка имеет смысл для меня - просто нет способа представить последовательность unicode NULL
в текстовом результате.
Можно ли мне запросить одни и те же данные JSON без необходимости выполнять "санитарию" по входящим данным? Эти структуры JSON регулярно меняются, поэтому сканирование определенного атрибута (device_name
в этом случае) не будет хорошим решением, поскольку легко могут быть другие атрибуты, которые могут содержать похожие данные.
После еще нескольких исследований кажется, что это новое поведение для версии 9.4.1 как упомянутое в журнале изменений:
Это действительно было намерение? Является ли понижение до 9.4.1 жизнеспособным вариантом здесь?... Поэтому
\u0000
теперь также будет отклоняться в значениях json, когда требуется преобразование в отмененную форму. Это изменение не нарушает возможности сохранения\u0000
в столбцах json, если обработка значений не выполняется...
<суб > В качестве дополнительной заметки это свойство берется из имени клиентского мобильного устройства - пользователя, который ввел этот текст в устройство. Как на самом деле пользователь ввел NULL
и REPLACEMENT CHARACTER
значения?!
Суб >