【问题标题】:Programming error: You must not use 8-bit bytestrings编程错误:您不能使用 8 位字节串
【发布时间】:2015-04-15 22:25:08
【问题描述】:

我正在尝试在 python 2.7(windows) 中运行以下命令,但它给了我一个错误:

ProgrammingError: 你不能使用 8 位字节串,除非你使用 text_factory 可以解释 8 位字节字符串(如 text_factory = 字符串)。强烈建议您将应用程序切换为 Unicode 字符串。

#!/usr/bin/python
# -*- encoding: utf-8-*-

import sqlite3;
db = sqlite3.connect('db.sqlite3')
cursor = db.cursor()
cursor.execute('INSERT INTO X(id,a,b) VALUES(?,?,?)', (999998,"ą---ź---ć---ó---ęĘ","ssf"))
cursor.execute('SELECT * FROM X where id = 999998')
for row in cursor:
    print row

db.commit()
db.close()

如何将这些字符串(“ąźć” = 波兰符号)插入到我的 sqlite 数据库中?

【问题讨论】:

    标签: python python-2.7 sqlite


    【解决方案1】:

    您可以遵循他们的建议:“只需将您的应用程序切换为 Unicode 字符串。”

    cursor.execute(
        'INSERT INTO X(id,a,b) VALUES(?,?,?)',
        (999998,u"ą---ź---ć---ó---ęĘ","ssf"))
    

    注意字符串文字前的u。这使它成为一个 unicode 文字。

    【讨论】:

    • 这给了我另一个错误:SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xb9 in position 0: invalid start byte
    • B9 不是您粘贴到示例中的字符。我推断您的 encoding " 语句中列出了错误的编码。或者,如果您愿意,您的文本编辑器使用错误的编码保存了文件。在任何一种情况下,您实际拥有的编码和您声称拥有的编码都不会'不匹配。
    • 您的文件实际使用的编码似乎是Windows-1250
    • 尝试说服您的文本编辑器将文件保存为 utf-8,或者尝试将编码行更改为 # -*- encoding: windows-1250
    • "encoding: utf-8" 行并没有设置文件的编码,而是通知 Python(可能还有其他工具)编码已经是什么。由于您的文件不是 utf-8 编码的,因此 Python 在说它是时会感到困惑。
    【解决方案2】:

    对于初学者,您是否尝试过按照错误消息的提示进行操作?

    也就是说,db.text_factory = str 紧跟在 connect 之后。

    【讨论】:

    • 当我添加时,我得到以下输出:"(999998, '\xb9---\x9f---\xe6---\xf3---\xea\xca', ' ssf')"
    • @user3142434 这只是 Python 对编码为 UTF-8 的数据的表示。请参阅docs.python.org/2/reference/… 处的表格。这是 Python 2 的奇怪行为之一,由尝试打印元组引起。如果你只是打印row[1],它是一个字符串,它应该显示为正确的字符。
    • 好的。现在没有错误,但输出不是预期的:╣---č---Š---ˇ---ŕ╩
    • 请参阅 Rob 回答中的 cmets。您没有将保存代码的文件保存为 UTF-8。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2011-08-02
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多