SQL Like with wildcard returns 某些字母的错误结果
SQL Like with wildcard returns wrong result on certain letters
我不明白为什么在使用带通配符的 like 关键字时会得到错误的结果。
为了便于讨论,我做了一个小例子来说明我的问题。
假设我们有一些 table
CREATE TABLE TestingLike(
[Name] VARCHAR(50)
)
INSERT INTO TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
现在当我使用这个搜索条件时
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'L%'
第一个查询 returns (A, AB) 而第二个 returns 只是 L。
奇怪的是,使用临时 tables
时并没有发生这种情况
看在上帝的份上,有人可以解释一下为什么会这样吗?
我做了一些研究,但找不到答案,我正在使用 SQL SERVER RC1 2017 以及 SQL SMS。
感谢您的宝贵时间。
下面是执行计划图
我无法使用拉丁语排序规则进行重现,但如果我使用克罗地亚语排序规则则可以,因为在克罗地亚语(和其他一些斯拉夫语言1)中,Lj
是由两个字符组成的单个不同字母,并且是 not L
后跟 j
。 Lj (digraph) 在维基百科上对此进行了讨论
如果 tempdb
的排序规则与出现问题的此特定数据库的默认排序规则不同,您不会遇到与临时 tables/table 变量相同的问题。
Complete/self 包含在家玩的人的复制脚本:
declare @TestingLike table(
[Name] VARCHAR(50) collate Croatian_CI_AI
)
INSERT INTO @TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'L%'
你如何着手 "fixing" 这取决于你的总体目标。如果您的代码按照克罗地亚规则播放,则它可以正常工作。否则,您可能需要更改数据库的默认排序规则。 但是,默认排序规则仅在创建 时适用。因此,您还必须更改每个现有列以将排序规则更改为您需要的。
1我在整个回答中都使用克罗地亚语,但我的意思当然是 "any collation where Lj
is a digraph".
我不明白为什么在使用带通配符的 like 关键字时会得到错误的结果。 为了便于讨论,我做了一个小例子来说明我的问题。 假设我们有一些 table
CREATE TABLE TestingLike(
[Name] VARCHAR(50)
)
INSERT INTO TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
现在当我使用这个搜索条件时
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'L%'
第一个查询 returns (A, AB) 而第二个 returns 只是 L。 奇怪的是,使用临时 tables
时并没有发生这种情况看在上帝的份上,有人可以解释一下为什么会这样吗? 我做了一些研究,但找不到答案,我正在使用 SQL SERVER RC1 2017 以及 SQL SMS。
感谢您的宝贵时间。
下面是执行计划图
我无法使用拉丁语排序规则进行重现,但如果我使用克罗地亚语排序规则则可以,因为在克罗地亚语(和其他一些斯拉夫语言1)中,Lj
是由两个字符组成的单个不同字母,并且是 not L
后跟 j
。 Lj (digraph) 在维基百科上对此进行了讨论
如果 tempdb
的排序规则与出现问题的此特定数据库的默认排序规则不同,您不会遇到与临时 tables/table 变量相同的问题。
Complete/self 包含在家玩的人的复制脚本:
declare @TestingLike table(
[Name] VARCHAR(50) collate Croatian_CI_AI
)
INSERT INTO @TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'A%'
SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'L%'
你如何着手 "fixing" 这取决于你的总体目标。如果您的代码按照克罗地亚规则播放,则它可以正常工作。否则,您可能需要更改数据库的默认排序规则。 但是,默认排序规则仅在创建 时适用。因此,您还必须更改每个现有列以将排序规则更改为您需要的。
1我在整个回答中都使用克罗地亚语,但我的意思当然是 "any collation where Lj
is a digraph".