Python与MySql unicode问题

问题描述 投票:9回答:8

我需要从我的python脚本调用MySQL存储过程。作为参数之一,我传递了一个unicode字符串(俄语),但是我得到了一个错误;

UnicodeEncodeError:'latin-1'编解码器无法编码位置0-1中的字符:序数不在范围内(256)

我的剧本:

  self.db=MySQLdb.connect("localhost", "usr", "pass", "dbName")
  self.cursor=self.db.cursor()
  args=("какой-то текст") #this is string in russian
  self.cursor.callproc('pr_MyProc', args)
  self.cursor.execute('SELECT @_pr_MyProc_2') #getting result from sp
  result=self.cursor.fetchone()
  self.db.commit()

我已经读过设置charset='utf8' shuld解决了这个问题,但是当我使用字符串时:

self.db=MySQLdb.connect("localhost", "usr", "pass", "dbName", charset='utf8')

这给了我另一个错误;

UnicodeEncodeError:'utf-8'编解码器无法对位置20中的字符'\ udcd1'进行编码:不允许代理

此外,我试图设置参数qazxsw poo,这是行不通的。

python mysql unicode utf-8 character-encoding
8个回答
5
投票

更多要检查的事项:use_unicode=True

可能的项目:

你能提取HEX吗? # -*- coding: utf-8 -*-应该是utf8:какой-то текст


3
投票

这是一些想法。也许不是回应。我过去一直在玩python / mysql / utf-8 / unicode,这是我记得的事情:

看看Saltstack mysql模块的评论:

D0BA D0B0 D0BA D0BE D0B9 2D D182 D0BE D182 20 D0B5 D0BA D181 D182

https://github.com/saltstack/salt/blob/develop/salt/modules/mysql.py#L314-L322

我们看到,为避免更改结果字符串,use_unicode设置为False,而charset(可能是utf-8)设置为参数。 use_unicode更像是一个'请求'来获取作为unicode字符串的响应。

您可以在此处检查测试中的实际用法:# MySQLdb states that this is required for charset usage # but in fact it's more than it's internally activated # when charset is used, activating use_unicode here would # retrieve utf8 strings as unicode() objects in salt # and we do not want that. #_connarg('connection_use_unicode', 'use_unicode') connargs['use_unicode'] = False _connarg('connection_charset', 'charset') ,其中包含名为“标准语”的数据库。

现在关于消息UnicodeEncodeError:'utf-8'编解码器不能编码字符'\ udcd1'**。你正在使用** unicode,但你告诉模块它是utf-8。在utf-8中编码unicode字符串之前,它不是utf-8。

也许你应该尝试:

https://github.com/saltstack/salt/blob/develop/tests/integration/modules/test_mysql.py#L311-L361

至少在python3中这是必需的,因为默认情况下你的“какой-тотекст”不是utf-8。


2
投票

MySQLdb模块与python 3不兼容。这可能是你遇到问题的原因。我建议使用不同的连接器,如args=(u"какой-то текст".encode('utf-8')) PyMySQL

相关:mysqlclient


2
投票

也许你可以在23376103重新加载你的sys并尝试将字符串解码为utf-8如下:

utf-8

2
投票

我最近遇到了类似的问题,但使用PostgreSQL。在尝试了SO / Internet的大量建议之后,我意识到问题出在我的数据库中。我不得不放弃我的数据库并重新安装Postgres,因为由于某种原因它不允许我更改数据库的默认排序规则。我赶时间,所以无法找到更好的解决方案,但建议相同,因为我只是在部署环境中启动我的应用程序。祝一切顺利。


1
投票

你的数据库是什么字符集? 使用 :

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

...

stringUtf8 = u''.join(string_original).decode('utf-8')

或者查看数据库的字符集


1
投票

我在这看到两个问题。

  1. 您有unicode但是您尝试通过设置参数“charset”将其定义为utf-8。您应该首先将您的unicode编码为utf-8或其他编码系统。
  2. 如果它不起作用,请尝试使用init_command ='SET NAMES UTF8'参数。

所以它看起来像:

show variables like "characetr%"; 

你也可以尝试这个:

conn = MySQLdb.connect(charset='utf8', init_command='SET NAMES UTF8')

0
投票

我遇到了类似的问题,这是由数据库中的无效utf-8数据引起的;似乎MySQL不关心这一点,但Python确实如此,因为它遵循UTF-8规范,即cursor = db.cursor() cursor.execute("SET NAMES UTF8;")

  • utf-8中不允许使用代理对
  • utf-8不允许不成对的代理人

如果你想“让它工作”,你将不得不拦截MySQL数据包并使用你自己的转换器,它将执行临时替换。

这是“处理”包含代理项的无效数据的一种方法:

that

请注意,处理它的正确方法是依赖于上下文的,但有一些常见的替换方案,如def borked_utf8_decode(data): """ Work around input with unpaired surrogates or surrogate pairs, replacing by XML char refs: look for "&#\d+;" after. """ return data.decode("utf-8", "surrogatepass") \ .encode("utf-8", "xmlcharrefreplace") \ .decode("utf-8")

这里有一种方法可以将其插入this one(另一种方法是猴子补丁字段处理,参见例如.pymysql):

https://github.com/PyMySQL/PyMySQL/issues/631
© www.soinside.com 2019 - 2024. All rights reserved.