您正在将捏造的名称传递到 Unicode 字符串的字符串格式化参数中。理想情况下,以这种方式传递的字符串也应该是 Unicode。
但fabricate_hebrew_name 不返回Unicode - 它返回UTF-8 编码的字符串,这是不一样的。
因此,摆脱对编码('utf-8')的调用,看看这是否有帮助。
下一个问题是 runsql 期望什么类型。如果它需要 Unicode,没问题。如果它需要 ASCII 编码的字符串,那么您将会遇到问题,因为希伯来语不是 ASCII。在不太可能的情况下,它需要 UTF-8 编码字符串,那么就需要在替换完成后对其进行转换。
在另一个答案中,Ignacio Vazquez-Abrams 警告不要在查询中进行字符串插值。这里的概念是,您通常应该使用参数化查询,并将希伯来语字符串作为参数传递给它,而不是使用 % 运算符进行字符串替换。这可能在查询优化和针对 SQL 注入的安全性方面具有一些优势。
Example
# -*- coding: utf-8 -*-
import sqlite3
# create db in memory
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE personal ("
"id INTEGER PRIMARY KEY,"
"name VARCHAR(42) NOT NULL)")
# insert random name
import random
fabricate_hebrew_name = lambda: random.choice([
u'ירדן',u'יפה',u'תמי',u'ענת', u'רבקה',u'טלי',u'גינה',u'דנה',u'ימית',
u'אלונה',u'אילן',u'אדם',u'חווה'])
cur.execute("INSERT INTO personal VALUES("
"NULL, :name)", dict(name=fabricate_hebrew_name()))
conn.commit()
id, name = cur.execute("SELECT * FROM personal").fetchone()
print id, name
# -> 1 אלונה