sqlite3.ProgrammingError:除非使用可解释8位字节串的text_factory,否则不得使用8位字节串

在Python中使用SQLite3,我试图存储一个UTF-8 HTML代码片段的压缩版本。

代码如下所示:

... 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. 

如果我使用“文本”而不​​是“blob”,并不压缩HTML代码片段,它工作正常(分贝是很大虽然)。 当我使用“blob”并通过Python zlib库进行压缩时,出现上述错误消息。 我环顾四周,但找不到这个简单的答案。

如果您想在sqlite3中使用8位string而不是unicodestring,请为sqlite连接设置approptiate text_factory:

 connection = sqlite3.connect(...) connection.text_factory = str 

find解决scheme,我应该花更多的时间search。

解决scheme是将这个值“转换”为Python的“缓冲区”,如下所示:

 c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html)))) 

希望这会帮助别人。

为了使用BLOBtypes,您必须先将zlib压缩string转换为二进制数据,否则sqlite将尝试将其作为文本string处理。 这是用sqlite3.Binary()完成的。 例如:

 c.execute('insert or ignore into blah values (?, ?)',(cid, sqlite3.Binary(zlib.compress(html)))) 

您可以使用repr(html)而不是原始输出存储该值,然后在检索使用的值时使用eval(html)。

 c.execute('insert or ignore into blah values (?, ?)',(1, repr(zlib.compress(html))))