SQL Server 的 LIKE 运算符是不是区分大小写?

Posted

技术标签:

【中文标题】SQL Server 的 LIKE 运算符是不是区分大小写?【英文标题】:Is the LIKE operator case-sensitive with SQL Server?SQL Server 的 LIKE 运算符是否区分大小写? 【发布时间】:2013-02-04 10:12:25 【问题描述】:

在documentation about the LIKE operator 中,没有任何关于它区分大小写的信息。是吗?如何启用/禁用它?

我正在查询varchar(n) 列,安装在 Microsoft SQL Server 2005 上,如果这很重要的话。

【问题讨论】:

这取决于您的列(或数据库)的排序规则。如果区分大小写,则LIKE 区分大小写,如果不区分,则LIKE 不区分 查看有关 SQL-Server 排序规则的文档msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx 你的目标是什么?您希望它区分大小写还是不区分大小写? 区分大小写默认为列上的排序规则,该列默认为数据库上的排序规则。大部分都是圆形的,你想走哪条路? 【参考方案1】:

区分大小写的不是运算符,而是列本身。

执行 SQL Server 安装时,会为实例选择默认排序规则。除非另有明确说明(检查下面的 collat​​e 子句),否则在创建新数据库时,它会从实例继承排序规则,当创建新列时,它会从其所属的数据库继承排序规则。

sql_latin1_general_cp1_ci_as 之类的排序规则规定应如何处理列的内容。 CI 代表不区分大小写,AS 代表区分重音。

完整的排序规则列表可在https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx获得

(a) 检查实例排序规则

select serverproperty('collation')

(b) 检查数据库排序规则

select databasepropertyex('databasename', 'collation') sqlcollation

(c) 使用不同的排序规则创建数据库

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) 使用不同的排序规则创建列

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(e) 修改列排序规则

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

可以更改实例和数据库排序规则,但不会影响以前创建的对象。

也可以动态更改列排序规则以进行字符串比较,但在生产环境中非常不推荐这样做,因为它的成本非常高。

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1

【讨论】:

似乎[A-Z] 之类的字符范围始终不区分大小写。 [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ] 然而似乎服从排序规则。 另外,您可以使用以下内容查询特定列的区分大小写:select COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn' @jumxozizi 我已将您的建议添加到答案中。 @JeppeStigNielsen 我已将您的建议添加到答案中。【参考方案2】:

所有关于整理的讨论似乎有点过于复杂。为什么不直接使用类似的东西:

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'

那么无论排序规则如何,您的支票都不区分大小写

【讨论】:

因为这不是 sargable。您的示例使用变量和前导通配符。但是对于使用不区分大小写的排序规则索引的列 like 'a%' 可以使用索引,而 upper 版本不能。 问题是like 运算符是否区分大小写。 您需要知道排序规则,否则这样做可能毫无意义。例如,如果查询的列使用Latin1_General_CI_AS,那么执行UPPER(@@VALUE) NOT LIKE '%SOMETHING%'@@COLUMN NOT LIKE '%SOMETHING%' 是无关紧要的:结果将是相同的。【参考方案3】:

如果你想在不改变列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,你总是可以使用COLLATE子句,例如

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 1 row

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
-- 2 rows

GO    
DROP TABLE dbo.foo;

如果您的列/数据库/服务器区分大小写并且您不想要区分大小写的搜索,例如

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 2 rows

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
-- 1 row

GO
DROP TABLE dbo.foo;

【讨论】:

当心在最后一个查询中,如果你使用WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%',它将返回John,因为这个排序规则大写J介于小写j和小写k之间。就像aAbBcC...jJkKlLmM... 这并不明显。似乎Latin1_General_BIN 使用 LIKE 运算符的范围搜索更容易预测。 这是帮助我的答案【参考方案4】:

您可以在定义表格时选择定义排序顺序。如果您定义区分大小写的顺序,您的 LIKE 运算符将以区分大小写的方式运行;如果您定义不区分大小写的排序规则,LIKE 运算符也将忽略字符大小写:

CREATE TABLE Test (
    CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);

这是一个quick demo on sqlfiddle,显示了使用LIKE 进行搜索时的整理顺序结果。

【讨论】:

【参考方案5】:

like 运算符接受两个字符串。这些字符串必须具有兼容的排序规则,here 对此进行了解释。

在我看来,事情会变得复杂。以下查询返回一个错误,指出排序规则不兼容:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

在这里的随机机器上,默认排序规则是SQL_Latin1_General_CP1_CI_AS。以下查询成功,但没有返回任何行:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

值“abc”和“ABC”在区分大小写的世界中不匹配。

换句话说,没有排序规则和使用默认排序规则是有区别的。当一侧没有排序规则时,则从另一侧“分配”一个显式排序规则。

(显式排序在左侧时结果相同。)

【讨论】:

你能针对不是像 INFORMATION_SCHEMA.TABLES 这样的系统对象的表重现错误吗? @AaronBertrand 。 . .我可以。数据库坏了;)? 不知道,我现在在移动设备上,无法启动 Windows VM。我只是不知道您的整个描述在技术上是否准确。【参考方案6】:

尝试运行,

SELECT SERVERPROPERTY('COLLATION')

然后找出您的排序规则是否区分大小写。

【讨论】:

【参考方案7】:

你可以改变每个项目的属性。

【讨论】:

【参考方案8】:

您可以在 Microsoft SQL Server Management Studio 中轻松更改排序规则。

右键单击表格 -> 设计。 选择您的列,向下滚动 i 列属性到排序规则。 通过选中“区分大小写”设置您的排序首选项

【讨论】:

以上是关于SQL Server 的 LIKE 运算符是不是区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server LIKE 查询中需要转义哪些字符[重复]

.SQL Server中 image类型数据的比较

SQL学习——LIKE运算符

LIKE运算符是否与MSSQL Server区分大小写?

sql server 全文检索 使用

][SQL Server]关键字 'like' 附近有语法错误。