我有sqlite数据库,我想在希伯来语中插入值
我一直收到以下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 0: ordinal
not in range(128)
我的代码如下:
runsql(u'INSERT成个人版 值(%(ID)d,%(名称)s)'% { 'ID':1, '姓名':fabricate_hebrew_name()})
def fabricate_hebrew_name():
hebrew_names = [u'ירדן',u'יפה',u'תמי',u'ענת',u'רבקה',u'טלי',u'גינה',u'דנה',u'ימית',u'אלונה',u'אילן',u'אדם',u'חווה']
return random.sample(names,1)[0].encode('utf-8')
注意:runsql
在sqlite数据库上执行查询
fabricate_hebrew_name()
应该返回一个可以在我的SQL查询中使用的字符串。
非常感谢任何帮助。
答案 0 :(得分:4)
您正在将伪造的名称传递给Unicode字符串的字符串格式参数。理想情况下,以这种方式传递的字符串也应该是Unicode。
但是fabricate_hebrew_name没有返回Unicode - 它返回UTF-8编码的字符串,这是不一样的。
所以,摆脱编码调用('utf-8'),看看是否有帮助。
接下来的问题是runsql期望的类型。如果它期待Unicode,没问题。如果它期望ASCII编码的字符串,那么你会遇到问题,因为希伯来语不是ASCII。在不太可能的情况下,它期望UTF-8编码字符串,那么就是转换它的时间 - 在替换完成之后。
在另一个答案中,Ignacio Vazquez-Abrams警告不要在查询中进行字符串插值。这里的概念是,使用%运算符而不是进行字符串替换,通常应使用参数化查询,并将希伯来字符串作为参数传递给它。这可能在查询优化和SQL注入安全性方面具有一些优势。
# -*- 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 אלונה
答案 1 :(得分:2)
您不应手动编码,也不应use string interpolation for queries。