我正在尝试在我的sqlite数据库中存储压缩字典。首先,我使用json.dumps
将字典转换为字符串,这似乎工作正常。在DB中存储此字符串也有效。
在下一步中,我正在使用encode("zlib")
压缩我的字符串。但是将结果字符串存储在我的数据库中会引发错误。
mydict = {"house":"Haus","cat":"Katze","red":u'W\xe4yn',"dict":{"1":"asdfhgjl ahsugoh ","2":"s dhgsuoadhu gohsuohgsduohg"}}
dbCommand("create table testTable (ch1 varchar);")
# convert dictionary to string
jch1 = json.dumps(mydict,ensure_ascii=True)
print(jch1)
# store uncompressed values
dbCommand("insert into testTable (ch1) values ('%s');"%(jch1))
# compress json strings
cjch1 = jch1.encode("zlib")
print(cjch1)
# store compressed values
dbCommand("insert into testTable (ch1) values ('%s');"%(cjch1))
第一个打印输出:
{"house": "Haus", "dict": {"1": "asdfhgjl ahsugoh ", "2": "s dhgsuoadhu gohsuohgsduohg"}, "red": "W\u00e4yn", "cat": "Katze"}
第二张印刷品当然不可读:
xワフ1テPCᆵyfᅠネノ õ
我之前是否需要进行任何其他转换?
期待任何有用的暗示!
答案 0 :(得分:2)
让我们从后面解决这个问题:为什么你首先使用gzip编码?你认为你需要在数据库中节省空间吗?你有没有检查字典字符串的生产时间?这些字符串在压缩之前需要具有最小长度才能实际节省存储空间(对于小输入字符串,输出甚至可能大于输入!)。如果这实际上节省了一些磁盘空间:您是否考虑过由于gzip编码和解码而导致的额外CPU负载和处理时间是否值得节省空间?
除此之外:gzip / zlib压缩的结果是二进制blob。在Python 2中,它应该是str
类型。在Python 3中,这应该是bytes
类型。在任何情况下,数据库都需要知道存储的是二进制数据! VARCHAR
不是此项工作的正确数据类型。以下是MySQL文档的引用:
另外,如果要存储二进制值,例如来自的结果 加密或压缩功能,可能包含任意字节 值,使用BLOB列而不是CHAR或VARCHAR列 避免可能发生的尾随空间移除的潜在问题 数据值。
同样的考虑也适用于其他数据库。同样在SQLite的情况下,您必须使用BLOB数据类型(请参阅docs)来存储二进制数据(如果您想确保获取与之前输入的完全相同的数据: - ))。
答案 1 :(得分:0)
非常感谢Jan-Philip,
你告诉我正确的解决方案。我的表需要有一个BLOB条目来存储数据。这是工作代码:mydict = {"house":"Haus","cat":"Katze","red":u'W\xe4yn',"dict":{"1":"asdfhgjl ahsugoh ","2":"s dhgsuoadhu gohsuohgsduohg"}}
curs.execute("create table testTable (ch1 BLOB);")
# convert dictionary to string
jch1 = json.dumps(mydict,ensure_ascii=True)
cjch1 = jch1.encode("zlib")
# store compressed values
curs.execute('insert into testTable values (?);', [buffer(cjch1)])
db.commit()