Python 3.x 使用pyodbc和python3查询具有特殊字符的字段时出现内存不足错误 环境 Python:3.4.2 pyodbc:4.0.23 操作系统:Debian9 DB:Sybase 12.5.3 驱动程序:unixODBC 2.3.1 问题
我正在使用Django和SQLAlchemy将一个web应用程序从Python2移植到Python3,除了对任何表执行“选择*”的查询之外,其他一切都正常工作。我使用以下代码对其进行了测试:Python 3.x 使用pyodbc和python3查询具有特殊字符的字段时出现内存不足错误 环境 Python:3.4.2 pyodbc:4.0.23 操作系统:Debian9 DB:Sybase 12.5.3 驱动程序:unixODBC 2.3.1 问题,python-3.x,encoding,out-of-memory,sybase,pyodbc,Python 3.x,Encoding,Out Of Memory,Sybase,Pyodbc,我正在使用Django和SQLAlchemy将一个web应用程序从Python2移植到Python3,除了对任何表执行“选择*”的查询之外,其他一切都正常工作。我使用以下代码对其进行了测试: connector = "DRIVER={%s};Server=%s;Database=%s;UID=%s;PWD=%s;TDS_Version=%s;Port=%s;" % my_db conn = db.connect(connector) cur = conn.cursor() query = 'SE
connector = "DRIVER={%s};Server=%s;Database=%s;UID=%s;PWD=%s;TDS_Version=%s;Port=%s;" % my_db
conn = db.connect(connector)
cur = conn.cursor()
query = 'SELECT * FROM My_Table'
cur.execute(query)
row = cur.fetchall()
预期行为,表中每一行的元组列表,以及所有可用列。然而,与此相反,我从python获得了一个“DEAD”标志,在syslog中有以下行:
Jul 25 09:26:27 my_machine kernel: [8628886.255305] Out of memory: Kill process 25238 (python) score 909 or sacrifice child.
同样的代码在Python2中工作得很好。我决定尝试查询更少的字段。只要求两个字段(ID、昵称),代码在Python3中运行良好,因此进行了更多的尝试,发现当我的查询返回一个包含特殊字符的字段(如ç、ã等)时,会出现以下错误:
"pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?') (2403) (SQLGetData)")"
说到蟒蛇3,我忘了什么吗?如何使代码再次工作?要使用Python3,我必须执行以下操作:
import pyodbc as db # forgot the imports
conn.setdecoding(db.SQL_CHAR, encoding='latin1')
conn.setencoding('latin1')
当我通知编码组时,我的代码与Python3一起工作。出于某种原因,Python2不需要它,无论如何,我在写这个问题时发现了这一点,并决定分享解决方案。要使用Python3,我必须这样做:
import pyodbc as db # forgot the imports
conn.setdecoding(db.SQL_CHAR, encoding='latin1')
conn.setencoding('latin1')
当我通知编码组时,我的代码与Python3一起工作。出于某种原因,Python2不需要它,无论如何,我在写这个问题时发现了这一点,并决定分享解决方案