pysqlite2:ProgrammingError - 您不能使用8位字节串

时间:2010-05-14 22:44:44

标签: python sqlite pysqlite

我目前在sqlite数据库中为了我自己的目的而持久化文件名。每当我尝试插入具有特殊字符的文件(如é等)时,都会引发以下错误:

pysqlite2.dbapi2.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.

当我通过使用unicode方法(例如:unicode(filename))将发送到pysqlite的值包装“切换到Unicode字符串”时,会抛出此错误:

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

我能做些什么来摆脱这个吗?修改我的所有文件以符合不是一个选项。

更新 如果我通过filename.decode("utf-8")解码文本,我仍然会收到上面的ProgrammingError。

我的实际代码如下:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [filename.decode("utf-8")])

我的代码应该是什么样的?

5 个答案:

答案 0 :(得分:14)

您需要指定filename的编码以转换为Unicode,例如:filename.decode('utf-8')。只需使用unicode(...)选择控制台编码,这通常是不可靠的(通常是ascii)。

答案 1 :(得分:3)

您应该以Unicode的形式传递SQL语句的参数。

现在,这一切都取决于如何获取文件名列表。也许您正在使用os.listdiros.walk阅读文件系统?如果是这种情况,只需将Unicode参数传递给这些函数中的任何一个,就可以直接将文件名作为Unicode: 例子:

  • os.listdir(u'.')
  • os.walk(u'.')

当然,您可以将u'.'目录替换为您正在阅读其内容的实际目录。只需确保它是一个Unicode字符串。

答案 2 :(得分:1)

您是否尝试过直接传递unicode字符串:

cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))

您需要在脚本开头添加文件编码:

# coding: utf-8

答案 3 :(得分:1)

你已经想到了这一点,但是:

我认为你实际上不能从cursor.execute获取那个ProgrammingError异常(“select * from musiclibrary where absolutepath =?;”,[filename.decode(“utf-8”)]),作为当前的问题的状态。

utf-8解码会爆炸,或者cursor.execute调用会对结果感到满意。

答案 4 :(得分:-1)

尝试更改为:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [unicode(filename,'utf8')])

在您的文件名中,来源不会使用utf8进行编码,请将utf8更改为您的编码。