我正在尝试使用 jOOQ 将序列化的 JSON 插入 Postgres JSONB 列,但它失败了,因为序列化的 JSON 有一个\\0
在它里面。
jOOQ 有没有办法自动为我们逃脱这个问题?
这是我得到的异常:
org.jooq.exception.DataAccessException: SQL [insert into ...];
ERROR: unsupported Unicode escape sequence
Detail: \u0000 cannot be converted to text.
Where: JSON data, line 1: ...ity":17,"REDACTED":["REDACTED"],"REDACTED":... at
org.jooq_3.15.8.POSTGRES.debug(Unknown Source) at
org.jooq.impl.Tools.translate(Tools.java:2997) at
org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:639) at
org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:354) at
org.jooq.impl.DMLQueryAsResultQuery.fetch(DMLQueryAsResultQuery.java:137) at
org.jooq.impl.ResultQueryTrait.fetchLazy(ResultQueryTrait.java:278) at
org.jooq.impl.ResultQueryTrait.fetchLazyNonAutoClosing(ResultQueryTrait.java:287) at
org.jooq.impl.ResultQueryTrait.fetchOne(ResultQueryTrait.java:506) at
...
鉴于您提供的详细信息错误报告#13903 https://github.com/jOOQ/jOOQ/issues/13903,我不认为 jOOQ 可以为您做太多开箱即用的事情。这NUL
可以包含在字符串中的字节在 PostgreSQL 中似乎具有特殊含义,因此被禁止:
- https://www.commandprompt.com/blog/null-characters-workarounds-arent-good-enough/ https://www.commandprompt.com/blog/null-characters-workarounds-arent-good-enough/
- 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节? https://stackoverflow.com/q/28813409/521799
- 一字节“char”类型在 PostgreSQL 中到底是如何工作的? https://dba.stackexchange.com/a/166167/2512
你可以试试这个:
select '{"a":"\u0000"}'::jsonb;
你会得到这个错误:
SQL 错误 [22P05]:错误:不支持的 Unicode 转义序列
详细信息: \u0000 无法转换为文本。
位置:8
其中:JSON 数据,第 1 行:{"a":...
展示这一点与jOOQ本身无关。 jOOQ 无法代表您对此进行合理编码,因为任何选择的编码都将不可避免地与某些用户的其他数据发生冲突。例如,如果"\u0000"
被编码为"#u0000"
,那么这可能会打破一些用户已经对两者之间的差异做出的假设\
and #
人物。因此,jOOQ 无法提供开箱即用的功能。
但是,您可以编码NUL
字节以任何你想要的方式使用自定义jOOQ数据类型绑定 https://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)