SQLite3 - 一个单元格与列中的其他单元格类型不同

时间:2016-07-11 08:40:18

标签: python sqlite

我有一个SQLite3 db。我使用 SQLite浏览器和Python来处理这个数据库。我有一个列description,它是tabe上的一个文本列。我使用 Sqlite3浏览器更改了一行中的文本。从那时起,我在python脚本中遇到错误。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 36: ordinal not in range(128)

我已经尝试捕获此异常并打印行,我意识到,除了文本,还有对象缓冲区(这只是一个单元格),行中的其他单元格正常:

<read-write buffer ptr 0x047684B0, size 4307 at 0x04768490>

这是唯一具有此对象的单元格,我没有修改的单元格是unicode。

如何解决这个问题?有没有办法将缓冲区转换为数据库中的字符串?

编辑:python代码

with engine.connect() as connection:
    for row in connection.execute('SELECT * FROM final_table'):
        try:
            if any(x in ' '.join(unicode(y) for y in row[:2]+row[3:4]+row[5:13]+row[14:]) for x in ('mm445','xxs', '998s54a')):
                print row[:2]+row[3:4]+row[5:13]+row[14:]
                for x in row:
                    print type(x)
        except:
            print 'exc'
            print row[:2]+row[3:4]+row[5:13]+row[14:]

1 个答案:

答案 0 :(得分:1)

您可以使用unicode()将字节字符串从某些编码转换为Unicode,但除非您指定编码,否则Python会假定它是ASCII。

SQLite不使用ASCII而是使用UTF-8,所以你必须告诉Python它:

...join(unicode(y, 'UTF-8') for y in ...)