Юникод в Python превращается в '\ xXX \ xXX' - PullRequest
2 голосов
/ 02 ноября 2011

Я использую MySQLdb, я использую:

cursor.execute(QUERY)

Где QYERY:

INSERT (A,B,C) VALUES("%s","%s",something);'%(k1, u'W')**

w Это персидская буква (буквально это! Я просто заменила ее на W, если у вас возникли проблемы с просмотром персидских букв, это что-то вроде ب), а k1 - английский. но я получаю:

`Traceback (most recent call last):
  File "./i.py", line 47, in <module>
    c.doit(db)
  File "./i.py", line 41, in doit
    db.cr.execute('INSERT (A,B,C) VALUES("%s","%s",something);'%(k1, u'ب'))
  File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'(term_tit,term_desc,term_cat) VALUES("a\n","\xd8\xa8",general)\' at line 1')`

См? буква W превращается в "\ xd8 \ xa8" Что мне делать?

Обновление: ошибка в sql-запросе исправлена, НО проблема \ xd8 \ xa8 сохраняется, Теперь при получении данных из базы данных я получаю « ?????? » вместо того, что я ввел

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Вы пропустили предложение INTO table_name.Это единственная реальная проблема, которую я вижу.

Изменение ب на \xd8\xa8 просто означает, что ваш Unicode кодируется как UTF-8 на пути к базе данных (чтоэто, вероятно, то, что вы хотите).MySQL сообщает байты в кодировке UTF-8, используя нотацию \xXX ( шестнадцатеричные escape последовательности; например, \x20 означает пробел ASCII), чтобы дать все-Сообщение об ошибке ASCII (может быть немного загадочным, особенно если вы к нему не привыкли, но это не проблема).

0 голосов
/ 02 ноября 2011

В документах рекомендуется избегать проблем, используя метки-заполнители и позволяя Python выполнять замену строк:

 db.cr.execute('INSERT (A,B,C) VALUES(?, ?,something)', (k1, u'W'))

Метки-заполнители в основном предназначены для предотвращения атак с использованием инъекций но они также заботятся о правильном экранировании строки и решении проблем кодирования.

Дайте мне знать, если это поможет с проблемой замены юникода.

...