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

时间:2019-06-08 15:14:33

标签: c# postgresql

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

  

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

我用Google搜索了它,一般建议是,它指向一个空字段,但在我的情况下并非如此。我跟踪了导致错误的字符串,它是这样的:

  

解决以下问题:令$ 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#类上的转义字符串是:

Sub test()
    Dim fooString As String
    Dim fooCollection As VBA.collection
    Set fooCollection = New VBA.collection
    fooCollection.Add "bar", "bar"
    useString (fooString)
    useCollection fooCollection
End Sub

Public Function useString(foo As String)
    MsgBox ("useString")
End Function

Public Function useCollection(ByRef foo As VBA.collection)
    MsgBox ("useCollection")
End Function

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

如果我手动改写此字段,导入将起作用,因此此字符串有100%的问题。

1 个答案:

答案 0 :(得分:0)

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

来自文档: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(其中数字代表一个八进制字节值)和\ xhexdigits(其中十六进制代表十六进制字节值)。 (由您负责创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后的所有其他字符均按字面意义使用。因此,要包含反斜杠字符,请写两个反斜杠(\)。另外,除了常规的''之外,还可以通过写\'将单引号包含在转义字符串中。

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