使用python将压缩字符串存储到sqlite数据库

使用python将压缩字符串存储到sqlite数据库,python,json,sqlite,dictionary,compression,Python,Json,Sqlite,Dictionary,Compression,我正试图在我的sqlite数据库中存储一个压缩字典。首先,我使用json.dumps将dict转换为字符串,这似乎很好。将此字符串存储在DB中也可以工作 在下一步中,我将使用encode(“zlib”)压缩字符串。但是将结果字符串存储在数据库中会引发错误 mydict = {"house":"Haus","cat":"Katze","red":u'W\xe4yn',"dict":{"1":"asdfhgjl ahsugoh ","2":"s dhgsuoadhu gohsuohgsduohg"}

我正试图在我的sqlite数据库中存储一个压缩字典。首先,我使用
json.dumps
将dict转换为字符串,这似乎很好。将此字符串存储在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ᅠネノ õ
我需要做任何额外的转换之前


期待任何帮助提示

让我们从后面来探讨这个问题:为什么首先要使用gzip编码?您认为需要在数据库中节省空间吗?您是否检查过字典字符串将在生产中使用多长时间?在压缩真正节省存储空间之前,这些字符串需要有最小的长度(对于较小的输入字符串,输出甚至可能大于输入!)。如果这确实节省了一些磁盘空间:您是否仔细考虑了由于gzip编码和解码而增加的CPU负载和处理时间是否值得节省空间

除此之外:gzip/zlib压缩的结果是一个二进制blob。在Python 2中,这应该是
str
类型。在Python3中,这应该是类型
bytes
。在任何情况下,数据库都需要知道存储的都是二进制数据
VARCHAR
不是此项工作的正确数据类型。以下是MySQL文档的一段引文:

另外,如果您想存储二进制值,例如 可能包含任意字节的加密或压缩函数 值,使用BLOB列而不是CHAR或VARCHAR列 避免删除尾随空间可能会改变的潜在问题 数据值


对其他数据库也有同样的考虑。同样,对于SQLite,您必须使用BLOB数据类型(请参阅)来存储二进制数据(如果您希望确保返回与之前输入的数据完全相同的数据:-)。

让我们从后面来探讨这个问题:为什么您首先要使用gzip编码?您认为需要在数据库中节省空间吗?您是否检查过字典字符串将在生产中使用多长时间?在压缩真正节省存储空间之前,这些字符串需要有最小的长度(对于较小的输入字符串,输出甚至可能大于输入!)。如果这确实节省了一些磁盘空间:您是否仔细考虑了由于gzip编码和解码而增加的CPU负载和处理时间是否值得节省空间

除此之外:gzip/zlib压缩的结果是一个二进制blob。在Python 2中,这应该是
str
类型。在Python3中,这应该是类型
bytes
。在任何情况下,数据库都需要知道存储的都是二进制数据
VARCHAR
不是此项工作的正确数据类型。以下是MySQL文档的一段引文:

另外,如果您想存储二进制值,例如 可能包含任意字节的加密或压缩函数 值,使用BLOB列而不是CHAR或VARCHAR列 避免删除尾随空间可能会改变的潜在问题 数据值


对其他数据库也有同样的考虑。同样,对于SQLite,您必须使用BLOB数据类型(请参阅)来存储二进制数据(如果您希望确保返回与之前输入的数据完全相同的数据:-)。

让我们从后面来探讨这个问题:为什么您首先要使用gzip编码?您认为需要在数据库中节省空间吗?您是否检查过字典字符串将在生产中使用多长时间?在压缩真正节省存储空间之前,这些字符串需要有最小的长度(对于较小的输入字符串,输出甚至可能大于输入!)。如果这确实节省了一些磁盘空间:您是否仔细考虑了由于gzip编码和解码而增加的CPU负载和处理时间是否值得节省空间

除此之外:gzip/zlib压缩的结果是一个二进制blob。在Python 2中,这应该是
str
类型。在Python3中,这应该是类型
bytes
。在任何情况下,数据库都需要知道存储的都是二进制数据
VARCHAR
不是此项工作的正确数据类型。以下是MySQL文档的一段引文:

另外,如果您想存储二进制值,例如 可能包含任意字节的加密或压缩函数 值,使用BLOB列而不是CHAR或VARCHAR列 避免删除尾随空间可能会改变的潜在问题 数据值


对其他数据库也有同样的考虑。同样,对于SQLite,您必须使用BLOB数据类型(请参阅)来存储二进制数据(如果您希望确保返回与之前输入的数据完全相同的数据:-)。

让我们从后面来探讨这个问题:为什么您首先要使用gzip编码?您认为需要在数据库中节省空间吗?您是否检查过字典字符串将在生产中使用多长时间?在压缩真正节省存储空间之前,这些字符串需要有最小的长度(对于较小的输入字符串,输出甚至可能大于输入!)。如果这确实节省了一些磁盘空间:您是否仔细考虑了由于gzip编码和解码而增加的CPU负载和处理时间是否值得节省空间

除此之外:gzip/zlib压缩的结果是一个二进制blob。在Python 2中,这应该是
str
类型。在Python3中,这应该是类型
bytes
。在任何情况下,数据库都需要知道存储的都是二进制数据
VARCHAR
不是此项工作的正确数据类型。下面是一段引用自
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()