为什么在插入MySQL数据库时会出现UnicodeEncodeError?

1 投票
2 回答
618 浏览
提问于 2025-04-15 22:18
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

MySQLdb.connect中的read_default_*选项不能通过default-character-set来设置字符集。你需要手动设置这个字符集:

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

或者在你的Django数据库设置中做相应的设置。

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

撰写回答