使用Python语言中的SQLite3,我尝试存储UTF-8HTML代码片段的压缩版本。
代码如下所示:
...
c = connection.cursor()
c.execute('create table blah (cid integer primary key,html blob)')
...
c.execute('insert or ignore into blah values (?, ?)',(cid, zlib.compress(html)))
此时会出现错误:
sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
如果我使用'text‘而不是'blob’,并且不压缩HTML代码片段,它就能正常工作(虽然db太大了)。当我使用'blob‘并通过Python zlib库进行压缩时,我得到了上面的错误信息。我环顾四周,但找不到这个问题的简单答案。
发布于 2010-10-26 11:59:17
如果您希望在sqlite3中使用8位字符串而不是unicode字符串,请为sqlite连接设置适当的text_factory:
connection = sqlite3.connect(...)
connection.text_factory = str
发布于 2010-08-06 23:50:35
找到了解决方案,我应该多花一点时间去寻找。
解决方案是将值‘强制转换’为Python 'buffer',如下所示:
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))
希望这能对其他人有所帮助。
发布于 2014-07-09 22:00:54
为了使用BLOB类型,您必须首先将zlib压缩字符串转换为二进制数据-否则sqlite将尝试将其作为文本字符串处理。这是通过sqlite3.Binary()完成的。例如:
c.execute('insert or ignore into blah values (?, ?)',(cid,
sqlite3.Binary(zlib.compress(html))))
https://stackoverflow.com/questions/3425320
复制相似问题