【问题标题】:Like statement in SQL Server query not returning all resultsSQL Server 查询中的 Like 语句不返回所有结果
【发布时间】:2020-11-04 14:27:48
【问题描述】:

我有一个数据库表,其列类型为nvarchar(max),值为“17KAAKSPN13”

当使用'%17KA%'之类的testcolumn查询表时,不会返回任何结果。如果我使用 '%17KAA%' 进行查询,我会得到结果。

要对此进行测试,请创建一个简单的表并执行以下查询,然后查看第二个查询没有返回任何结果:

更新:服务器排序规则:Danish_Norwegian_CI_AS

CREATE TABLE [dbo].testtable(
    testcolumn [nvarchar](max) NULL
) 

insert into [dbo].testtable (testcolumn) values('17KAAKSPN13')

SELECT * FROM [dbo].testtable 
SELECT * FROM [dbo].testtable WHERE testcolumn like '%17KA%'

结果:

编辑:

Here 是它不起作用的一个例子。我将其添加为编辑,因为有很多 cmets 和两个不合适的小提琴。这个问题似乎与排序规则有关。

【问题讨论】:

  • 它与%17KA%-sqlfiddle.com/#!18/9ba05/1按预期工作
  • 您在添加示例方面做得很好。你能告诉使用你的排序规则吗? SELECT CONVERT (varchar(256), SERVERPROPERTY('collation'));
  • 当然,服务器排序规则是 Danish_Norwegian_CI_AS
  • AA 是丹麦语中 Å 的另一种形式,这意味着您存储的 AA 被视为 Å,而不是 AA。我不懂丹麦语,但之前出现过一个相同的问题
  • AA 仍存储为 AA,而不是 Å。您可以使用 select cast(testcolumn as varbinary(max)) from dbo.testtable; 确认 - AA 字符返回为 0x41004100 而 Å 将返回 0xC500。

标签: sql sql-server sql-like


【解决方案1】:

来自这里 - https://stackoverflow.com/a/53802337/13927312

尝试看看在你的模式之前添加 N(将其标记为 Unicode)是否有任何不同。它可能无法解释这种行为,但可以解决您的问题。

SELECT * FROM [dbo].testtable WHERE testcolumn like N'%17KA%'

【讨论】:

  • 这显然不是答案——它的排序规则是 cmets 中讨论的问题。如果你尝试你的答案,你会发现它没有任何区别。
【解决方案2】:

您可以将 COLLATE 子句转换为排序规则,这使得 LIKE 可以解决。

SELECT * FROM [dbo].testtable WHERE testcolumn collate SQL_Latin1_General_CP1_CI_AS 
like '%17KA%' collate SQL_Latin1_General_CP1_CI_AS 

From MSDN on collation

字符文字和变量被分配了默认排序规则 当前数据库。 为列引用分配了定义 列的排序规则。

【讨论】:

    【解决方案3】:

    我认为问题在于,在挪威语和丹麦语中,“AA”与“A”是不同的字符。因此,您不能仅将其作为“A”进行搜索。

    原因是“AA”是代表Å的一种方式。

    因此,您的代码运行正常。您可以转换为不同的排序规则,其中'AA' 只是'A' 跟在'A' 之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2020-08-31
      • 2016-01-16
      相关资源
      最近更新 更多