【问题标题】:Django + Postgres: A string literal cannot contain NUL (0x00) charactersDjango + Postgres:字符串文字不能包含 NUL (0x00) 字符
【发布时间】:2019-12-13 17:15:44
【问题描述】:

我正在同步大量数据并且我收到了这个错误:A string literal cannot contain NUL (0x00) characters. 显然这是一个 postgres 问题,但我不太确定如何解决它。有没有办法在 Django 模型级别去除空字符?我正在同步大量字段。

【问题讨论】:

  • 大多数字符串以NUL 字符结尾。你到底想在数据库中存储什么?如果你想存储二进制数据,你应该把它存储在BinaryField:docs.djangoproject.com/en/2.2/ref/models/fields/#binaryfield
  • @WillemVanOnsem 这只是文本。它们是来自网站的字段,例如“标题”和“正文”。
  • 我认为您应该检查您尝试存储在数据库中的文本,可能是您的刮刀存在编码问题 (?)。

标签: python django postgresql


【解决方案1】:

除非您确实想要存储 NUL 字符,否则您应该清理您的文本,使其不包含它们。在模型级别,您需要定义一个 clean_fieldname 方法来执行此操作。

如果您确实想存储它们,则需要将它们存储在数据库中的二进制兼容字段中。 Django 1.6+ 有 BinaryField 应该可以工作。

【讨论】:

    【解决方案2】:

    This bug fix 建议:

    s.decode("utf-8", errors="replace").replace("\x00", "\uFFFD")
    

    只有 .replace 是 OP 问题所必需的,它将 null 替换为 � 字符。我也包含了.decode,因为它可以防止在类似情况下可能出现的其他编码问题。

    这将在某处的 .clean 方法中使用 - 如果您想全局应用它,可能是 TextField 或 CharField 的子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2018-09-03
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      相关资源
      最近更新 更多