2011-12-24 1 views
1

Я хочу деактивировать кодированную строку UTF-8 перед ее использованием как частью инструкции MySQL SELECT.Sanitizing закодированные строки UTF-8

К примеру, у меня есть:

query = MySQLdb.escape_string(query) 

, но эта линия ведет к поднятым исключением того, что читает

«ASCII» кодек не может кодировать символы в положении 0-2: порядковый номер не в диапазон (128).

Как я могу справиться с этим?

+1

Очевидно, что-то берет на себя вашу строку в US-ASCII, а не UTF-8. Я бы попробовал явно кодировать его с помощью чего-то вроде 'query.encode (« utf-8 »)' –

ответ

3

Похоже, MySQLdb пытается кодировать ваш запрос unicode в строку. Для этого используется кодировка по умолчанию: ASCII.

Теперь ваш вход не может быть закодирован в ASCII, поэтому вам просто нужно указать python, какую кодировку он должен использовать: utf-8.

Вы можете добиться этого с помощью query = query.encode('utf-8').

+0

Точно моя проблема. Мне нужно входить и выходить из кодировок UTF-8, чтобы MySQL был счастлив и чтобы все остальные были счастливы. – SK9

+0

Это, к сожалению, происходит постоянно, со многими модулями, всякий раз, когда вы используете строки unicode без кода ASCII, которые python не может обрабатывать самостоятельно. Для вашей проблемы с MySQLdb вам может понадобиться изучить уровень ORM, например SQLAlchemy. –

0
query = "こうえん" 
query = MySQLdb.escape_string(unicode(query,'utf-8')) 
+1

Это дает «Исключительное значение: декодирование Unicode не поддерживается». Я использую Python 2.6.6. Я удалил «こ う え ん» из вопроса, потому что это не помогает. – SK9

+0

Нужно ли устанавливать глобальный набор символов для MySQL? – SK9

+0

Какая функция дает ошибку? Попробуйте разделить две функции, то есть 'query = unicode (query, 'utf-8')', а затем передать 'query' в функцию escape. На какой строке находится ошибка? – FakeRainBrigand

3

В вашем примере query имеет тип 'str'. Если вы поместите «u» перед строкой, она станет типа «unicode».

>>> query = "こうえん" 
>>> print type(query) 
<type 'str'> 
>>> query = u"こうえん" 
>>> print type(query) 
<type 'unicode'> 

Это одно из основных отличий между версиями Python 2.x и 3.x. Начиная с 3.0, все строки являются «unicode» по умолчанию.

+0

* Примечание: * Я не думаю, что у меня установлен этот модуль, но это общее решение общей проблемы. Я надеюсь, что это сработает, но если это не будет, то код Ады, вероятно, будет (или комбинация из двух). – FakeRainBrigand

+0

Я использую Python 2.6.6. Я удалил «こ う え ん» из вопроса, потому что это не помогает. – SK9

+0

Нужно ли устанавливать глобальный набор символов для MySQL? – SK9

Смежные вопросы