sqlite3.OperationalError:无法解码为UTF-8列

AG1*_*AG1 6 python sqlite

我有一个带有这一行信息的sqlite数据库,ù应该是' - '

sqlite> select * from t_question where rowid=193;
193|SAT1000|having a pointed, sharp qualityùoften used to describe smells|pungent|lethargic|enigmatic|resolute|grievous
Run Code Online (Sandbox Code Playgroud)

当我从python中读取该行时,我得到了这个错误,我做错了什么?

Traceback (most recent call last):
  File "foo_error.py", line 8, in <module>
    cur.execute(sql_string)
  sqlite3.OperationalError: Could not decode to UTF-8 column 'posit' with text 'having a pointed, sharp qualityùoften used to describe smells'
Run Code Online (Sandbox Code Playgroud)

Python文件:

import sqlite3
conn = sqlite3.connect('sat1000.db')
cur = conn.cursor()
sql_string = 'SELECT * FROM t_question WHERE rowid=193'
cur.execute(sql_string)
conn.close()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 21

设置text_factorystr:

conn = sqlite3.connect('sat1000.db')
conn.text_factory = str
Run Code Online (Sandbox Code Playgroud)

这将导致cur返回strs而不是自动尝试str使用UTF-8编解码器解码.

我没能找到decodings和编码的任何链,将改变'ù'一个连字符,但也有许多可能的Unicode连字符,例如u'-',u'\xad',u'\u2010',u'\u2011',u'\u2043',u'\ufe63'u'\uff0d',我也没有排除可能性的这样一个链条解码/编码可能存在.但是,除非您能找到正确的转换,否则最简单的方法是使用它str.replace来修复字符串.

更正:

In [43]: print('ù'.decode('utf-8').encode('cp437').decode('cp1252'))
—    # EM DASH u'\u2014'
Run Code Online (Sandbox Code Playgroud)

所以有解码/编码链可以转换'ù'成某种形式的连字符.


Yuc*_*ang 8

conn.text_factory = str 对我不起作用。

我用conn.text_factory = bytes. 参考这里:https : //stackoverflow.com/a/23509002/6452438


Ada*_*gle 6

unutbu 的答案在当前版本的 Python 3 中不起作用。设置conn.text_factory = str不会做任何事情,因为的默认值text_factory 已经是 str

问题可能是您的数据库列中的文本不是有效的 UTF-8。默认情况下,Python 的decode()函数在看到这样的文本时会抛出异常。但是你可以设置一个text_factory告诉decode()忽略这样的错误,像这样:

conn = sqlite3.connect('my-database.db')
conn.text_factory = lambda b: b.decode(errors = 'ignore')
Run Code Online (Sandbox Code Playgroud)

然后查询应该没有错误地运行。