我正在通过 SQL Alchemy 使用 pyodbc 模块连接到 MS SQL 服务器。一切似乎都运行良好,直到我开始遇到编码问题。一些非 ascii 字符被替换为“?”
数据库有一个排序规则“Latin1_General_CI_AS”(我还检查了特定字段,它们保持相同的排序规则)。我开始在 create_engine
的调用中选择编码“latin1”,这似乎适用于西欧字符(如法语或西类牙语,字符如 é
)但不适用于复活节欧洲字符。具体来说,我对字符 ć
我一直在尝试选择其他编码as stated on Python documentation ,特别是 Microsoft 的,例如 cp1250
和 cp1252
,但我一直面临同样的问题。
有谁知道如何解决这些差异?排序规则“Latin1_General_CI_AS”是否与 Python 编码等效?
我当前连接的代码如下
for sqlalchemy import *
def connect():
return pyodbc.connect('DSN=database;UID=uid;PWD=password')
engine = create_engine('mssql://', creator=connect, encoding='latin1')
connection = engine.connect()
澄清和评论:
- 从数据库中检索信息时会出现此问题。我不需要存储任何东西。
- 一开始我没有指定编码,结果是,每当在数据库中遇到非 ascii 字符时,pyodbc 都会引发 UnicodeDecodeError。我更正了使用“latin1”作为编码的问题,但这并没有解决所有字符的问题。
- 我承认服务器不在 latin1 上,评论不正确。我一直在检查数据库排序规则和特定字段排序规则,似乎都在'Latin1_General_CI_AS'中,那么,如何存储
ć
?也许我没有正确理解排序规则。 - 我更正了一点问题,具体来说,我尝试了比
latin1
更多的编码,还有cp1250
和cp1252
(这显然是一个用于“Latin1_General_CI_AS”,根据 msdn)
更新:
好的,按照这些步骤,我得到数据库使用的编码似乎是 cp1252:http://bytes.com/topic/sql-server/answers/142972-characters-encoding 无论如何,这似乎是一个糟糕的假设,正如答案所反射(reflect)的那样。
更新 2: 无论如何,在正确配置 odbc 驱动程序后,我不需要在 Python 代码上指定编码。
最佳答案
您应该停止使用代码页并改用 Unicode。这是摆脱此类问题的唯一方法。
关于python - 编码从 pyodbc 到 MS SQL Server 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3750876/