数据库中的Zlib - Django

1 投票
2 回答
727 浏览
提问于 2025-04-15 11:39

当我尝试把一个经过 zlib 压缩的字符串放进 models.TextField 的时候

>>> f = VCFile(head = 'blahblah'.encode('zlib'))
>>> f.save()

它失败了:

    ...
raise DjangoUnicodeDecodeError(s, *e.args)
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0x9c in position 1: unexpected code byte. You passed in 'x\x9cK\xcaI\xccH\x02b\x00\x0eP\x03/' (<type 'str'>)

有没有什么办法可以解决这个问题(除了对字符串进行转义——我需要节省空间)?

2 个回答

0

如果你不想对它进行编码,那么你需要把它存储为二进制对象(BLOB),而不是字符串。Django 默认似乎不支持 BlobFields,所以你需要在网上找找相关的资料,或者自己动手搞定。

2

就像Marcus说的,如果你想把数据保持为二进制格式,就得用BLOB。如果你可以接受对数据进行编码,那就可以使用base64编码:

from base64 import binascii

f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))

在我非常简单的测试中,测试了33,000个字符,使用zlib压缩后的字符串大小只有原字符串的28%。而使用base64编码后的zlib字符串大小是原字符串的37%。虽然压缩效果没有那么好,但还是有很大的改善。

撰写回答