当我插入MySQL数据库时,为什么会出现这个UnicodeEncodeError?

时间:2010-05-03 21:34:15

标签: python mysql database django encoding

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 个答案:

答案 0 :(得分:2)

MySQLdb.connect(read_default_ *)选项不会设置default-character-set的字符集。您需要明确设置:

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

或django数据库设置中的等效设置。

答案 1 :(得分:0)

如果从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