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

时间:2010-08-06 15:34:25

标签: python unicode sqlite zlib

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

如果我使用'text'而不是'blob'并且不压缩HTML片段,那么它可以很好地工作(尽管db很大)。当我使用'blob'并通过Python zlib库进行压缩时,我收到上面的错误消息。我环顾四周,但找不到这个简单的答案。

5 个答案:

答案 0 :(得分:87)

如果你想在sqlite3中使用8位字符串而不是unicode字符串,请为sqlite连接设置approptiate text_factory:

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

答案 1 :(得分:35)

找到解决方案,我应该花一点时间搜索。

解决方案是将值“转换”为Python'缓冲区',如下所示:

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

希望这会对其他人有所帮助。

答案 2 :(得分:33)

为了使用BLOB类型,必须先将zlib压缩字符串转换为二进制数据 - 否则sqlite会尝试将其作为文本字符串处理。这是通过sqlite3.Binary()完成的。例如:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

语法:

5种可能的存储类型:NULL,INTEGER,TEXT,REAL和BLOB

BLOB通常用于存储腌制模型或莳萝腌制模型

(?!\S)