2014-09-11 33 views
1

我不斷收到我無法解釋的MSSQL服務器的意外行爲。對Microsoft Server 2012的Unicode查詢返回超額結果

例子: 請求

"""select * from vernacularname where (vernacularname = N'ᐱᓯᐢᑭᐤ')""" 

返回正確的結果(ID,vernacularname,語言)

1 ᐱᓯᐢᑭᐤ cr 

,還包括其他Unicode名稱的shitload,我不明白他們怎麼連接,如:

1 ܚܝܘܬܐ None 
1 ᓂᕐᔪᑦ iu 
1 እንስሳ ti 
5 ፈንገስ am 
6 ᐱᕈᖅᑐᖅ iu 
6 ᐅᐲᑭᒋᑳᓇ cr 
6 ގަސް dv 
212 ᐱᔦᓰᐢ cr 
212 ᏥᏍᏆ None 
212 ወፍ am 
212 བྱ། bo 
216 None 
216 ሓሽራ ti 
359 འུ་འཐུང་སྲོག་ཆགས། bo 
359 ጡት አጥቢ am 
359 ᐱᓱᒃᑎ iu 
360 རྟ་བླ། bo 
459 ᎠᏓᏢᎢᎯ None 

我正在使用python2.6.5和pyodbc s結束查詢。 (pymssql根本沒有處理unicode查詢)

任何有關錯誤的線索都是值得讚賞的。 非常感謝!

select * 
from vernacularname 
where (vernacularname COLLATE Latin1_General_BIN = N'ᐱᓯᐢᑭᐤ') 

這是SQL Server如何處理比較的結果是:

了Christoph

+0

python 3.1.2顯示相同的行爲。 – Christoph 2014-09-11 13:36:00

+0

剛剛注意到所有結果都以相同的前綴開始,當轉換爲utf-16時。 (但我仍然不知道如何解決這個問題):-( – Christoph 2014-09-11 13:57:17

回答

3

通過使用二進制排序在WHERE條件迫使Unicode值的比較添加COLLATE指定Latin1_General_BIN歸類子句條件的WHERE,它不是特定於python或pyodbc。我們可以通過查看originalupdated查詢之間的結果差異來證明SQL Server是罪魁禍首。

有關更詳細的解釋,請參閱Bart Duncan's reply here

+0

非常感謝,這正是我所期待的,我之前嘗試過使用collat​​e命令,但沒有得到它的工作。很好。 – Christoph 2014-09-12 13:34:20