Почему я получаю эту UnicodeEncodeError при вставке в базу данных MySQL? - PullRequest
1 голос
/ 04 мая 2010
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 2: ordinal not in range(128)

Я изменил свою базу данных по умолчанию на utf-8, а не на "latin" .... но эта ошибка все еще возникает. почему?

Это в my.cnf . Я делаю это неправильно? Я просто хочу, чтобы ВСЕ БЫЛО UTF-8.

init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci
default-character-set=utf8

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Параметры MySQLdb.connect (read_default_ *) не устанавливают набор символов из набора символов по умолчанию. Вам нужно будет установить это явно:

MySQLdb.connect(..., charset='utf8')

Или эквивалентный параметр в настройках баз данных django.

0 голосов
/ 04 мая 2010

Если вы получаете исключение из Python, то это не имеет ничего общего с MySQL - ошибка происходит перед отправкой выражения в MySQL. Я бы предположил, что драйвер MySQLdb не обрабатывает Unicode.

Если вы имеете дело с необработанным интерфейсом MySQLdb, это будет несколько раздражать (обертки базы данных, такие как SQLAlchemy, будут обрабатывать это за вас), но вы можете создать такую ​​функцию:

def exec_sql(conn_or_cursor, sql, *args, **kw):
    if hasattr(conn_or_cursor):
        cursor = conn_or_cursor.cursor()
    else:
        cursor = conn_or_cursor
    cursor.execute(_convert_utf8(sql), *(_convert_utf8(a) for a in args),
                   **dict((n, _convert_utf8(v)) for n, v in kw.iteritems()))
    return cursor

def _convert_utf8(value):
    if isinstance(value, unicode):
        return value.encode('utf8')
    else:
        return value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...