在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库进行压缩时,我收到上面的错误消息。我环顾四周,但找不到这个简单的答案。
答案 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)