从 pyodbc 到 MS SQL Server 的编码调用

Khe*_*ben 5 python sql-server encoding sqlalchemy

我使用 pyodbc 模块通过 SQL Alchemy 连接到 MS SQL 服务器。一切似乎都运行良好,直到我开始遇到编码问题。一些非 ascii 字符被替换为 '?'

DB 有一个排序规则“Latin1_General_CI_AS”(我还检查了特定字段,它们保持相同的排序规则)。我开始在调用中选择编码“latin1” create_engine,这似乎适用于西欧字符(如法语或西班牙语,如é),但不适用于复活节欧洲字符。具体来说,我的性格有问题?

我一直在尝试选择Python 文档中所述的其他编码,特别是 Microsoft编码,例如cp1250cp1252,但我一直面临同样的问题。

有谁知道如何解决这些差异?排序规则“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()
Run Code Online (Sandbox Code Playgroud)

澄清和评论:

  • 从数据库检索信息时会发生此问题。我不需要存储任何东西。
  • 一开始我没有指定编码,结果是,每当在 DB 上遇到非 ascii 字符时,pyodbc 都会引发 UnicodeDecodeError。我更正了使用“latin1”作为编码的问题,但这并不能解决所有字符的问题。
  • 我承认服务器不在latin1上,评论不正确。我一直在检查数据库排序规则和特定字段排序规则,并且似乎都在'Latin1_General_CI_AS'中,那么,如何?存储?也许我没有正确理解排序规则。
  • 我纠正了一点问题,具体来说,我尝试了比latin1, 还多的编码,cp1250并且cp1252(根据 msdn,这显然是在“Latin1_General_CI_AS”上使用的编码)

更新:

好的,按照这些步骤,我发现 DB 使用的编码似乎是 cp1252:http ://bytes.com/topic/sql-server/answers/142972-characters-encoding 无论如何,这似乎是一个错误的假设正如答案所反映的那样。

UPDATE2:无论如何,在正确配置odbc驱动程序后,我不需要在Python代码上指定编码。

sor*_*rin 2

您应该停止使用代码页并切换到 Unicode。这是摆脱此类问题的唯一方法。