我在postgresql数据库(9.4.1)中的JSON(不是JSONB)列中存储了一些JSON数据.其中一些JSON结构在其属性值中包含unicode序列.例如:
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }
Run Code Online (Sandbox Code Playgroud)
当我尝试查询此JSON列时(即使我没有直接尝试访问该device_name属性),我收到以下错误:
错误:不支持的Unicode转义序列
详细信息:\u0000无法转换为文本.
您可以通过在postgresql服务器上执行以下命令来重新创建此错误:
select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'
Run Code Online (Sandbox Code Playgroud)
这个错误对我有意义 - 根本没有办法NULL在文本结果中表示unicode序列.
有没有办法让我查询相同的JSON数据而不必对传入的数据执行"卫生"?这些JSON结构会定期更改,因此扫描特定属性(device_name在本例中)将不是一个好的解决方案,因为可能很容易存在可能包含类似数据的其他属性.
经过一些调查后,似乎这个行为对于版本9.4.1是新的,如更改日志中所述:
...因此
\u0000,当需要转换为转义形式时,现在也会在json值中被拒绝.\u0000只要没有对值进行处理,此更改不会破坏存储在json列中的能力...
这真的是意图吗?降级到9.4.1之前是否可行?
作为旁注,此属性取自客户端移动设备的名称 - 它是将此文本输入设备的用户.用户如何插入NULL和REPLACEMENT CHARACTER重视?!