首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sqlite3.ProgrammingError:除非使用可以解释8位字节字符串的text_factory,否则不能使用8位字节字符串

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

Stack Overflow用户
提问于 2010-08-06 23:34:25
回答 5查看 63.9K关注 0票数 92

使用Python语言中的SQLite3,我尝试存储UTF-8HTML代码片段的压缩版本。

代码如下所示:

代码语言:javascript
复制
...
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)))

此时会出现错误:

代码语言:javascript
复制
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库进行压缩时,我得到了上面的错误信息。我环顾四周,但找不到这个问题的简单答案。

EN

回答 5

Stack Overflow用户

发布于 2010-10-26 11:59:17

如果您希望在sqlite3中使用8位字符串而不是unicode字符串,请为sqlite连接设置适当的text_factory:

代码语言:javascript
复制
connection = sqlite3.connect(...)
connection.text_factory = str
票数 96
EN

Stack Overflow用户

发布于 2010-08-06 23:50:35

找到了解决方案,我应该多花一点时间去寻找。

解决方案是将值‘强制转换’为Python 'buffer',如下所示:

代码语言:javascript
复制
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))

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

票数 35
EN

Stack Overflow用户

发布于 2014-07-09 22:00:54

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

代码语言:javascript
复制
c.execute('insert or ignore into blah values (?, ?)',(cid, 
sqlite3.Binary(zlib.compress(html))))
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3425320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档