UnicodeEncodeError:'latin-1'编解码器无法编码字符u'\ u2014'

时间:2015-04-29 10:16:13

标签: python mysql unicode

我收到此错误UnicodeEncodeError:'latin-1'编解码器无法编码字符u'\ u2014'

我正在尝试将大量新闻文章加载到MySQLdb中。但是我在处理非标准字符时遇到困难,我为各种字符收到了数百个错误。我可以使用.replace()单独处理它们,虽然我想要一个更完整的解决方案来正确处理它们。

X

我的剧本;

ubuntu@ip-10-0-0-21:~/scripts/work$ python test_db_load_error.py
Traceback (most recent call last):
  File "test_db_load_error.py", line 27, in <module>
    cursor.execute(sql_load)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 157, in execute
    query = query.encode(charset)
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2014' in position 158: ordinal not in range(256)

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:7)

创建mysqldb连接时,将charset='utf8'传递给连接。

conn = mdb.connect(host, user, password, db_name, charset='utf8')

答案 1 :(得分:2)

如果您的数据库实际配置为Latin-1,那么您不能在其中存储非Latin-1字符。这包括U+2014, EM DASH

理想的解决方案是切换到为UTF-8配置的数据库。只需在最初创建数据库时传递charset='utf-8',并在每次连接时传递-。 (如果您已有现有数据,您可能希望使用MySQL工具将旧数据库迁移到新数据库,而不是Python代码,但基本思想是相同的。)

然而,有时这是不可能的。也许您有其他无法更新的软件,需要Latin-1,并且需要共享同一个数据库。或者,您可能以无法以编程方式取消混合的方式混合使用Latin-1文本和二进制数据,或者您的数据库太大而无法迁移。在这种情况下,您有两种选择:

  • 在存储和搜索之前,破坏性地将字符串转换为Latin-1。例如,您可能希望将em破折号转换为--?,或者它可能并不那么重要,您可以将所有非Latin-1字符转换为{{1} }(更快更简单)。

  • 提出一种编码方案,将非Latin-1字符走私到数据库中。这意味着一些搜索变得更加复杂,或者无法直接在数据库中完成。

答案 2 :(得分:0)

这可能是一个沉重的阅读,但至少让我开始。

http://www.joelonsoftware.com/articles/Unicode.html