当参数包含语言的特殊字符时,SQL中的IN和LIKE存在问题

当参数包含语言的特殊字符时,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

我有这样一个关键字表(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-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
我使用这种查询来限制Resultl与特定限定符匹配:

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和列具有相同的排序规则。服务器排序规则不同,但我检查过这不是问题所在。