数据库中的Zlib - Django
当我尝试把一个经过 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%。虽然压缩效果没有那么好,但还是有很大的改善。