在Python上查询来自MySQLdb查询结果的问题

时间:2016-02-11 17:08:58

标签: python mysql encoding mysql-python

我正在使用Python的MySQLdb库来访问带有葡萄牙语条目的数据库,带有一堆重音符,然后使用xlsxwriter将其保存到Excel文件中。当我关闭工作簿以保存它时,我收到以下错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xed in position 59: invalid continuation byte

它抱怨的结果是:

u'QNO XX Conjunto YY, No. Casa ZZ, CEP: AAAAAAAA, Bras\xedlia /DF'

具体而言,它应该是Brasília而不是Bras\xedlia。如何以更友好的方式对输出进行编码?我是否必须单独替换\xed之类的每个可能的重音?

- 编辑:

我知道ílatin-1)中的0xED是iso-8859-1,并且考虑到语言(以及来自db负责人的信息),我认为这是正确的编码。如何将'Bras\xedlia'的字符串转换为一般'Brasília'的字符串,知道这一点?

- 编辑:

如果我尝试使用str(that thing)我得到的是

'ascii' codec can't encode character u'\xed' in position 52: ordinal not in range(128)

2 个答案:

答案 0 :(得分:0)

您需要更改字段和桌子的字符集。

要执行此操作,请执行以下操作之一:

mysql> ALTER TABLE <table> CONVERT <col> VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci;23

mysql> ALTER TABLE <table> MODIFY <col> VARCHAR(50) CHARACTER SET utf8;23

我更喜欢第一个。

最后,正如Klaus D.所说,您需要使用charset="utf8"连接到mysql,请检查link

答案 1 :(得分:0)

这听起来像是xlswriter的问题,而不是python或MySQL。

0xED表示进入的字节是latin1,而不是utf8,而不是ascii。如果您遇到0xED,那么执行SET NAMES latin1以便python与MySQL正确通信。表格/列是CHARACTER SET latin1还是utf8并不重要,SET NAMES会导致INSERT / SELECT期间发生合适的转化(如果有) /等