Django + Postgres:字符串文字不能包含NUL(0x00)字符。

18

我正在同步大量数据,但是我收到了这个错误:字符串字面值不能包含 NUL(0x00)字符。 很显然,这是一个 postgres 问题,但我不太确定该如何解决。是否有一种方法可以在 Django 模型层级别上剔除空字符?我有一大堆字段需要同步。


1
大多数字符串都以NUL字符终止。您要在数据库中存储什么?如果要存储二进制数据,应将其存储在BinaryField中:https://docs.djangoproject.com/en/2.2/ref/models/fields/#binaryfield - Willem Van Onsem
@WillemVanOnsem 这只是文本。它们是来自网站的字段,例如“标题”和“正文”。 - aroooo
1
我认为你应该检查一下你试图存储在数据库中的文本,很可能是你的爬虫存在编码问题。 - Willem Van Onsem
2个回答

25

这个bug修复建议:

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

对于OP的问题,只需要使用.replace方法来替换null为一个�字符。我也包含了.decode方法,因为它可以保护在类似情况下可能出现的其他编码问题。

如果你想要全局应用这个方法,可以将其放在.clean方法中,或者在TextField或CharField子类中实现。


2

除非你确实想要存储NUL字符,否则应该对文本进行清理以使其不包含它们。在模型层面,你可以定义一个clean_fieldname方法来完成这个任务。

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


注:Original Answer翻译成“最初的回答”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接