22021:编码“UTF8”的字节序列无效:0x00

Gue*_*lla 5 c# postgresql

我正在从 C# 批量导入 PostgreSQL,其中一条记录给出了此错误:

22021:编码“UTF8”的字节序列无效:0x00

我用谷歌搜索了一下,一般建议是这指的是一个空字段,但在我的例子中情况并非如此。我找到了导致错误的字符串,它是:

解决以下问题:设 $A$ 为 Banach 代数,并设 $\sum:\0\rightarrow I\rightarrow\mathfrak A\overset\pi\to\longrightarrow A\rightarrow 0$ 为 $A$ 的扩展,其中 $\mathfrak A$ 是 Banach 代数,$I$ 是 $\mathfrak A$ 中的封闭理想。

我正在从 XML 文件中读取此内容,并在文件流上定义了 UTF-8。

我的反序列化 C# 类上的转义字符串是:

"Addresses the following: Let $A$ be a Banach algebra, and let $\\sum\\:\\0\\rightarrow I\\rightarrow\\mathfrak A\\overset\\pi\\to\\longrightarrow A\\rightarrow 0$ be an extension of $A$, where $\\mathfrak A$ is a Banach algebra and $I$ is a closed ideal in $\\mathfrak A$."
Run Code Online (Sandbox Code Playgroud)

显然,字符串有些不对劲。我猜测应该存在某种数学符号,但是这到底是什么破坏了导入并使 PostgreSQL 报告它是一个空字段?应该以什么格式读取?

如果我手动覆盖此字段,则导入有效,因此该字符串 100% 存在问题。

Nic*_*nju 2

由于它是批量导入,我假设您正在创建一个文件或某种大字符串以发送到 Postgres?在这种情况下,字符串可能启用了转义字符,而不是通过准备好的语句执行此操作。因此,Postgres 可能会将字符串中的 \0 转义并解释为 0x00。

来自文档: https: //www.postgresql.org/docs/8.3/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL 还接受“转义”字符串常量,这是 SQL 标准的扩展。通过在左单引号之前写入字母 E(大写或小写)来指定转义字符串常量,例如 E'foo'。(当跨行继续转义字符串常量时,仅在第一个左引号之前写入 E。)在转义字符串中,反斜杠字符 () 开始类似 C 的反斜杠转义序列,其中反斜杠和后续字符的组合) 代表一个特殊的字节值。\b 是退格键,\f 是换页符,\n 是换行符,\r 是回车符,\t 是制表符。还支持 \digits(其中digits 表示八进制字节值)和\xhexdigits(其中hexdigits 表示十六进制字节值)。(您有责任确保您创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后面的任何其他字符均按字面意思处理。因此,要包含反斜杠字符,请写入两个反斜杠 (\)。此外,除了正常的 '' 方式之外,还可以通过编写 \' 将单引号包含在转义字符串中。

因此,如果您的批量语句在字符串前面添加 E(例如 )E'hello',请不要这样做。