Ошибка спецификатора формата python% s для значений utf-8 - PullRequest
3 голосов
/ 29 декабря 2011

У меня есть следующий код Python, который отправляет данные в БД:

cursor.execute("INSERT INTO "+ DATA_TABLE + """ (fk_id, title, streetaddress,json) 
                 values (%(fk_id)s, %(title)s, %(address)s, %(json)s ) """ ,(
                 result))

Но я получаю ошибку:

  File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 185, in unicode_literal
    return db.literal(u.encode(unicode_literal.charset))
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256)

Это потому, что% s ожидает, что значение будетдопустимая строка latin-1, в то время как dict дает ей строку utf-8?Что такое обходной путь?

Примечание. JSON безопасно создан с использованием json.dumps.Имеет несколько символов разных языков.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

вы должны попытаться преобразовать всю вашу строку в Unicode

cursor.execute(u"INSERT INTO "+ unicode(DATA_TABLE) + u""" (fk_id, title, streetaddress,json) 
                 values (%(fk_id)s, %(title)s, %(address)s, %(json)s ) """ ,(
                 result))

и передать charset = "utf-8" для подключения, как указано в http://mysql -python.sourceforge.net / MySQLdb.html

0 голосов
/ 29 декабря 2011

Я не думаю, что это проблема с кодом форматирования python% s.В соответствии с документацией *1001* о форматировании строк Python он может форматировать юникод без проблем.Тем не менее, обратите внимание, что полученная строка будет в юникоде.

Вы рассмотрели все связанные вопросы, например, Как заставить MySQL правильно обрабатывать UTF-8 ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...