我连接到通过SQL炼金术一个MS SQL服务器调用,使用pyodbc模块。一切似乎都工作正常,直到我开始有问题的编码。一些非ASCII字符正在被替换为'?'编码从pyodbc到MS SQL Server的
数据库都有一个归类“Latin1_General_CI_AS”(我也检查了特定的领域和他们保持相同的排序规则)。我开始在create_engine
的调用中选择编码“latin1”,似乎适用于西欧字符(如法语或西班牙语,字符如é
),但不适用于复活节欧洲字符。具体来说,我有性格ć
我一直在试图选择像cp1250
和cp1252
其他编码as stated on Python documentation,特别是微软的,出了问题,但我一直面临着同样的问题。
有谁知道如何解决这些分歧?排序规则'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)
UPDATE:
OK,按照以下步骤,我得到DB使用的编码看起来是cp1252:http://bytes.com/topic/sql-server/answers/142972-characters-encoding 无论如何,这似乎是一个坏的假设,反映在答案上。
UPDATE2: 无论如何,在正确配置odbc驱动程序之后,我不需要在Python代码中指定编码。
请澄清您的问题:在从数据库获取数据或将数据存储到数据库或应用程序交互期间,会发生这些替换吗? 'Latin1_General_CI_AS'应该是'cp1252' – knitti 2010-09-20 11:22:04
cp1250和cp1252不是“latin1编码”。排序规则不是编码。请回复您的评论:谁说“服务器以latin1编码”?如果服务器希望所有的输入/输出都用latin1编码(我怀疑),那么你根本无法将一些东欧字符输入到你的数据库(也就是俄文,中文,希腊文等等)。 – 2010-09-20 11:24:52
这个http://msdn.microsoft.com/en-us/library/ms174596(v=SQL.90).aspx建议,对于Latin1_General_CI_AS使用的编码是cp1252。当然,'latin1'!='cp1252' – knitti 2010-09-20 11:32:08