【问题标题】:PostgreSQL - Error: invalid byte sequence for encoding "UTF8": 0x00PostgreSQL - 错误:用于编码“UTF8”的无效字节序列:0x00
【发布时间】:2022-07-28 16:23:49
【问题描述】:

目前,我们在 PostgresSQL 中插入记录时遇到问题。我的数据类型是 TEXT 类型。它抛出一个错误,说 Error: invalid byte sequence for encoding "UTF8": 0x00.

我们尝试插入的数据包含 RTF 文本,其中包含文本、图像,然后是文本。我们还确保没有传递或插入空值。

我们使用的是 **PostgresSQL **版本 9.6 和 12,编码设置为 UTF-8。

任何帮助将不胜感激。

带有文本和图像(包含特殊字符)的 RTF 数据应该毫无问题地插入 PostgresSQL。此外,数据类型应为 TEXT 类型。

【问题讨论】:

  • 您是否要在文本字段中保存二进制数据?可能您需要使用 uuencode 之类的东西对其进行编码。
  • 名字是PostgreSQL,不是PostresSQL。
  • 我们还确保没有传递或插入空值。您在确定时显然没有做好。你认为 0x00 不是空值是什么?图像不是文本,它是二进制的,您不能将其存储在任何数据库的文本字段中。

标签: database postgresql utf-8 postgresql-9.5


【解决方案1】:

您不能在 PostgreSQL 中将零字节存储为文本字符串的一部分。你有两个选择:

  • 如果不需要,则从输入字符串中删除该字符

  • 使用数据类型bytea,适用于二进制数据

如果你想坚持text,你还应该弄清楚文件的编码是什么。

【讨论】:

    【解决方案2】:

    如果您必须使用text 类型,您可以将其保存为base64 编码。

    与原始数据相比,数据库中有大约 30% 的空间开销,并且您的应用代码中有适量的 CPU 用于对其进行编码/解码。

    【讨论】:

      【解决方案3】:

      您可以使用decode 函数将二进制值(包括十六进制0)插入varchar 列:

      postgres=# create table jos(foo varchar);
      CREATE TABLE
      postgres=# insert into jos values('foo'||decode('00', 'hex')||'bar');
      INSERT 0 1
      postgres=# select * from jos;
           foo
      ------------------
       \x666f6f00626172
      (1 row)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2010-11-23
        • 2021-09-19
        相关资源
        最近更新 更多