当参数包含语言的特殊字符时,SQL中的IN和LIKE存在问题
我有这样一个关键字表(MS SQL):当参数包含语言的特殊字符时,SQL中的IN和LIKE存在问题,sql,tsql,special-characters,Sql,Tsql,Special Characters,我有这样一个关键字表(MS SQL): KeyGuid限定符原语键 DA7E4E27-FDE5-4D43-A365-8A789164A816蒂特柯克ä纳 EED58875-FE41-4A18-A93C-A44AA62CEEEE htit kirkänbh A0EB795E-EE23-4990-BAB9-897C93C70CE3 htit kirkänah F7F4632B-AC82-4DEB-B966-BBA8EF4D2C9E蒂特柯克änb C0EB795E-EE23-4990-BAB9-89
- KeyGuid限定符原语键
- DA7E4E27-FDE5-4D43-A365-8A789164A816蒂特柯克ä纳
- EED58875-FE41-4A18-A93C-A44AA62CEEEE htit kirkänbh
- A0EB795E-EE23-4990-BAB9-897C93C70CE3 htit kirkänah
- F7F4632B-AC82-4DEB-B966-BBA8EF4D2C9E蒂特柯克änb
- C0EB795E-EE23-4990-BAB9-897C93C70CE3 nam kirkänas
- E2F4632B-AC82-4DEB-B966-BBA8EF4D2C9E nam kirkänbs
- A222795E-EE23-4990-BAB9-897C93C70CE3 tit kirkacb
- B333632B-AC82-4DEB-B966-BBA8EF4D2C9E tit kirkaca
- 1222795E-EE23-4990-BAB9-897C93C70C81 htit kirkacbh
- E533632B-AC82-4DEB-B966-BBA8EF4D2C82 htit kirkacah
select * from KeyWord where PrimitiveKey like 'kirkän%'
- DA7E4E27-FDE5-4D43-A365-8A789164A816蒂特柯克ä纳
- EED58875-FE41-4A18-A93C-A44AA62CEEEE htit kirkänbh
- A0EB795E-EE23-4990-BAB9-897C93C70CE3 htit kirkänah
- F7F4632B-AC82-4DEB-B966-BBA8EF4D2C9E蒂特柯克änb
- C0EB795E-EE23-4990-BAB9-897C93C70CE3 nam kirkänas
- E2F4632B-AC82-4DEB-B966-BBA8EF4D2C9E nam kirkänbs
select * from KeyWord where Qualifier IN ('tit', 'htit') and PrimitiveKey Like 'kirkac%'
这一点非常有效:
- A222795E-EE23-4990-BAB9-897C93C70CE3 tit kirkacb
- B333632B-AC82-4DEB-B966-BBA8EF4D2C9E tit kirkaca
- 1222795E-EE23-4990-BAB9-897C93C70C81 htit kirkacbh
- E533632B-AC82-4DEB-B966-BBA8EF4D2C82 htit kirkacah
select * from KeyWord where Qualifier IN ('tit', 'htit') and PrimitiveKey Like 'kirkän%'
对于限定符的限制也是如此:
select * from KeyWord where (Qualifier = 'tit' OR Qualifier = 'htit') and PrimitiveKey Like 'kirkän%'
select * from KeyWord where (Qualifier like 'tit' OR Qualifier like 'htit') PrimitiveKey Like 'kirkän%'
但是,它确实是这样工作的:
select * from KeyWord where (Qualifier = 'tit' OR Qualifier = 'htit') and PrimitiveKey Like 'kirkän%'
select * from KeyWord where (Qualifier like 'tit' OR Qualifier like 'htit') PrimitiveKey Like 'kirkän%'
- DA7E4E27-FDE5-4D43-A365-8A789164A816蒂特柯克ä纳
- EED58875-FE41-4A18-A93C-A44AA62CEEEE htit kirkänbh
- A0EB795E-EE23-4990-BAB9-897C93C70CE3 htit kirkänah
- F7F4632B-AC82-4DEB-B966-BBA8EF4D2C9E蒂特柯克änb
IN方法有什么问题?这可能最好通过处理语言特定字符的特定排序规则设置来处理
这里有一篇关于SQL Server排序规则的文章可能会有所帮助:我认为您应该看看。正如Neil所说,我知道更改排序规则在这里会有所帮助,但使用FTS可能会带来一些好处,具体取决于实现的可伸缩性。可能需要使用unicode兼容的数据类型。将PrimitiveKey列声明为nvarchar,尝试在要匹配的字符串前面加上“N”前缀,如下所示:
选择*from关键字where(限定词如'tit'或限定词如'htit')和PrimitiveKey如N'kirkäN%'。我对这个问题做了更多的调查。这是我发现的 A.有问题的查询实际上返回结果,但仅包含“ae”:
select * from KeyWord where Qualifier IN ('tit', 'htit') and PrimitiveKey Like 'kirkän%'
返回例如“kirkaeni”
B.如果查询中包含另一个百分比(例如:像'ki%rkän%'),则结果包括预期的结果!(这很奇怪)(当然还有那些不想要的,当然与其他%相匹配)
C.我试图重现这个问题-创建一个简单的数据库,只包含两个表(一个带有“kirk”的东西,另一个表有外键),我使用了创建问题数据库的查询以及创建表的查询,我设置了相同的排序规则(德语电话簿CI_AI)+我创建了问题数据库中的索引。然而,这个问题并没有发生,所以我还不能实际重现它
有没有出现这些症状的新想法?看看
基本上与操作数相似,操作数有自己的排序规则覆盖服务器和列设置。然而,我还没有弄清楚在哪里或者是否有办法改变这个设置。上面的文章读起来很难,但我认为最详细的解释在底部。全文搜索可能是一种选择,但我们需要一个快速的解决方案。前缀没有帮助。列声明为“nvarchar”。已检查排序规则。我查询的表的DB和列具有相同的排序规则。服务器排序规则不同,但我检查过这不是问题所在。