对Microsoft Server 2012的Unicode查询返回多余的结果

时间:2014-09-11 12:51:25

标签: python tsql unicode odbc pyodbc

我不断从MSSQL服务器中得到意想不到的行为,我无法解释。

实施例: 请求

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

返回正确的结果(id,vernacularname,language)

1 ᐱᓯᐢᑭᐤ cr

还有一些其他unicode名称,我不知道它们是如何连接的,例如:

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发送查询。 (pymssql根本没有处理unicode查询)

任何关于出了什么问题的线索都表示赞赏。 非常感谢你!

了Christoph

1 个答案:

答案 0 :(得分:3)

通过在Latin1_General_BIN条件中添加COLLATE来指定WHERE归类,以强制使用二进制归类比较unicode值:

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

这是SQL Server处理WHERE子句条件比较的结果,它不是python或pyodbc特有的。我们可以通过查看originalupdated查询之间的结果差异来证明SQL Server是罪魁祸首。

有关更详细的说明,请参阅Bart Duncan's reply here