我在我的PostgreSQL数据库(9.4.1)中有一些JSON数据存储在一个JSON(非JSONB)列中。其中一些JSON结构包含其属性值中的Unicode序列。例如:
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }
当我尝试查询这个JSON列时(即使我并没有直接尝试访问device_name
属性),我会收到以下错误信息:
错误:不支持的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的新行为,如更改日志中所述:
...因此,在需要将其转换为反斜杠形式时,json值现在也会拒绝
\u0000
。 只要不对值进行任何处理,此更改不会破坏在json列中存储\u0000
的能力...
这真的是意图吗?降级到9.4.1之前的版本是否可行?
顺便说一句,此属性来自客户移动设备的名称 - 是用户将此文本输入设备的。用户如何插入NULL
和REPLACEMENT CHARACTER
值的?!
SELECT
- 我在 9.5 和 9.6 上使用 SQLUPDATE
语句时也遇到了同样的问题。 - Per LundbergSELECT
,编译器为 Visual C++ build 1800,32 位,结果返回了相同的错误。 - Daniel L. VanDenBoschjson_string.replace("\u0000", "")
)。 - DataGreed