LIKE运算符是否与MS SQL服务器区分大小写?
在有关LIKE操作符的文档中 ,没有任何关于它的区分大小写的内容。 是吗? 如何启用/禁用它?
我正在查询SQL Server 2005上的varchar(n)
列,如果这很重要的话。
大小写不是操作符,它是列本身。
执行SQL Server安装时,将为实例select默认sorting规则。 除非另外明确提到(请检查下面的collate子句),当创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的快速演示,显示LIKE
search的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_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”在大小写敏感的世界中不匹配。
换句话说,没有sorting和使用默认sorting之间是有区别的。 当一方没有整理时,则从另一方“分配”明确的整理。
(显式归类在左边的结果是一样的。)
尝试运行,
SELECT SERVERPROPERTY('COLLATION')
然后找出您的sorting规则是否区分大小写。