LIKE运算符是否与MS SQL服务器区分大小写?

在有关LIKE操作符的文档中 ,没有任何关于它的区分大小写的内容。 是吗? 如何启用/禁用它?

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

大小写不是操作符,它是列本身。

执行SQL Server安装时,将为实例select默认sorting规则。 除非另外明确提到(请检查下面的collat​​e子句),当创build一个新的数据库时,它会inheritance实例的sorting规则,当创build一个新列时,它会inheritance它所属数据库的sorting规则。

sql_latin1_general_cp1_ci_as这样的sortingsql_latin1_general_cp1_ci_as应该如何处理列的内容。 CI代表不区分大小写,AS代表区分重音。

有关sorting的完整列表,请访问https://msdn.microsoft.com/zh-cn/library/ms144250(v=sql.105).aspx

(a)检查实例整理

 select serverproperty('collation') 

(b)检查数据库整理

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

(c)使用不同的sorting规则创build数据库

 create database exampledatabase collate sql_latin1_general_cp1_cs_as 

(d)使用不同的sorting规则创build列

 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 

可以更改实例和数据库sorting规则,但不影响以前创build的对象。

在string比较中,也可以随时更改列归类,但这在生产环境中是非常不被推荐的,因为它非常昂贵。

 select column1 collate sql_latin1_general_cp1_ci_as as column1 from table1 

您可以select在定义表格时定义sorting顺序 。 如果你定义了一个区分大小写的命令,你的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 ); 

这里是sqlfiddle的快速演示,显示LIKEsearch的sorting顺序结果。

所有关于整理的讨论看起来都有些复杂。 为什么不使用像这样的东西:

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

然后你的支票不区分大小写

如果要在不更改列/数据库/服务器的sorting规则的情况下实现区分大小写的search,则始终可以使用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; 

如果你的列/数据库/服务器区分大小写,并且你不想区分大小写的search,也可以用另一种方式

 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; 

like运算符需要两个string。 这些string必须具有兼容的sorting规则,这在这里解释。

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

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

在这里的随机机器上,默认sortingSQL_Latin1_General_CP1_CI_ASSQL_Latin1_General_CP1_CI_AS 。 以下查询成功,但不返回任何行:

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

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

换句话说,没有sorting和使用默认sorting之间是有区别的。 当一方没有整理时,则从另一方“分配”明确的整理。

(显式归类在左边的结果是一样的。)

尝试运行,

 SELECT SERVERPROPERTY('COLLATION') 

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