Ошибка кодирования / декодирования Python и Hebrew

У меня есть база данных sqlite, которую я хотел бы вставить значения на иврите в

Я продолжаю получать следующую ошибку:

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

мой код выглядит следующим образом:

runql (u'INSERT в личные значения (% (ID) d,% (имя) s) '% {' ID ': 1,' name ': 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') 

note: runsql выполняющий запрос в базе данных sqlite, fabricate_hebrew_name() должен возвращать строку, которая может быть использована в моем SQL-запросе. Буду признателен за любую оказанную помощь.

    Вы передаете сфабрикованные имена в параметр форматирования строки для строки Unicode. В идеале строки, прошедшие этот путь, также должны быть Unicode.

    Но fabricate_hebrew_name не возвращает Unicode – возвращается строка с кодировкой UTF-8, которая не то же самое.

    Итак, избавьтесь от вызова encode ('utf-8') и посмотрите, помогает ли это.

    Следующий вопрос – какой тип runql ожидает. Если он ожидает Unicode, нет проблем. Если он ожидает строку, закодированную в ASCII, тогда у вас будут проблемы, потому что иврит не является ASCII. В маловероятном случае он ожидает кодированную строку UTF-8, тогда настало время ее преобразовать – после того, как будет выполнена замена.

    В другом ответе Игнасио Васкес-Абрамс предупреждает об интерполяции строк в запросах. Концепция здесь заключается в том, что вместо того, чтобы выполнять замену строк, используя оператор%, вы обычно должны использовать параметризованный запрос и передавать в качестве параметров ивритские строки. Это может иметь некоторые преимущества в оптимизации запросов и безопасности при вводе 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 אלונה 

    Вы не должны кодировать вручную, и вы не должны использовать интерполяцию строк для запросов .