PostgreSQL含空格JSONB键无法更新的问题求助
解决PostgreSQL JSONB带空格/特殊字符键的更新问题
问题原因
直接用字符串拼接JSONB的方式失败,大概率是因为字符串里的特殊字符(比如RAZÃO SOCIAL中的重音符号、空格)在JSON解析时出现编码匹配问题,导致PostgreSQL无法正确识别目标键。用%20替换空格是错误操作——JSON不使用URL编码,空格直接保留即可。
可行解决方案
方案1:使用jsonb_set精准更新
jsonb_set支持通过数组形式指定键路径,能完美处理带空格、特殊字符的键,还可单独更新单个键:
-- 更新单个带空格的键 UPDATE forms SET data = jsonb_set( data, array['RAZÃO SOCIAL'], -- 用数组指定键名,支持空格/特殊字符 '"aaaA"'::jsonb ) WHERE id = 10;
如果要同时更新多个键,可以嵌套jsonb_set:
-- 同时更新多个键(含带空格的键) UPDATE forms SET data = jsonb_set( jsonb_set(data, array['RAZÃO SOCIAL'], '"aaaA"'::jsonb), array['SIGLA'], '"ASCOM SOUREEEE"'::jsonb ) WHERE id = 10;
方案2:使用jsonb_build_object构建JSONB后合并
jsonb_build_object会直接构造合法的JSONB对象,无需手动拼接字符串,能自动处理特殊字符:
UPDATE forms SET data = data || jsonb_build_object('RAZÃO SOCIAL', 'aaaA', 'SIGLA', 'ASCOM SOUREEEE') WHERE id = 10;
这个方法和你原本的思路类似,但绕过了手动JSON字符串解析的坑,更稳定可靠。
内容的提问来源于stack exchange,提问作者Funny Dog
相关产品推荐
相关产品推荐

