Avatar ·

Проблема с кодировкой при записи в sqlite3

📁 python, ошибка, python2, ии

Пишу в Windows 7 на python 2.7.10.

#-*-coding: utf-8 -*-conn = db.connect('main.db')#conn.text_factory = strc = conn.cursor()c.execute('PRAGMA encoding=""UTF-8"";')c.execute('''CREATE TABLE IF NOT EXISTS user (login text, password text) ''')c.execute('''CREATE TABLE IF NOT EXISTS service (useame text, service_name text, service_login text, service_pwd text)''')print u""Добро пожаловать в менеджер паролей""print u""Разрешены только буквы латинского алфавита и цифры""name = raw_input(u""Представьтесь: "").strip()#name.decode('utf-8')c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))

Насколько мне известно формат строк в sqlite3 по умолчанию имеет кодировку utf-8. При попытке записать имя пользователя русскими буквами в базу sqlite3 получаю ошибку:

Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 30, in <module>
c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))
sqlite3.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.

Если использовать name.decode('utf-8') ,то ошибка другая:

Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 29, in <module>
name.decode('utf-8')
File ""C:\Python27\lib\encodings\utf_8.py"", line 16, in decode
retu codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte

Вычитал, что можно использовать conn.text_factory = str, при этом в базу пишутся русские буквы, но этого делать не рекомендуется и при этом буквы имеют вид:

Как же всё-таки записать в базу русские имена, чтобы они при этом выглядели нормально?

Попутно хочу спросить, как отловить сразу два exception (UnicodeDecodeError и TypeError) в конструкции try - exception которые возникают в случае, если пользователь ввёл не ту фразу с которой был зашифрован его пароль к какому-либо сервису:

try:    print u'пароль \t- ', aes.decrypt(i[1]).decode('utf-8')except: UnicodeDecodeError(u'Неправильная секретная фраза') 

P.S. пробую так:

print name.decode('cp1251').encode('utf-8').decode('utf-8')

печатает Сергей - т.е. как бы всё в utf-8, но ошибка всё равно есть:

Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 32, in <module>
c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))
sqlite3.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.

Обновление

Пробую так:

name = 'Сергей'print name.decode('cp1251').encode('utf-8').decode('utf-8')

Т. е. как бы всё в utf-8, но ошибка всё равно есть:

Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 32, in <module>
c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))
sqlite3.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.