我連接到通過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