Is the LIKE operator case-sensitive with SQL Server?

关于 LIKE 操作符的文档中,没有提到它的大小写敏感性。是吗? 如何启用/禁用它?

如果有必要的话,我正在查询2005年 Microsoft SQL Server 安装中的 varchar(n)列。

175640 次浏览

试着逃跑,

SELECT SERVERPROPERTY('COLLATION')

然后查明排序规则是否区分大小写。

您可以选择在定义表时定义 校对次序。如果定义了区分大小写的顺序,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进行搜索时的排序顺序结果。

It is not the operator that is case sensitive, it is the column itself.

执行 SQLServer 安装时,将为实例选择默认排序规则。除非另有明确提及(请检查下面的校对子句) ,否则在创建新数据库时,它将从实例继承排序规则,而在创建新列时,它将从其所属的数据库继承排序规则。

A collation like sql_latin1_general_cp1_ci_as dictates how the content of the column should be treated. CI stands for case insensitive and AS stands for accent sensitive.

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

(a)检查实例排序规则

select serverproperty('collation')

(b)检查数据库的整理情况

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

(c) To create a database using a different collation

create database exampledatabase
collate sql_latin1_general_cp1_cs_as

(d) To create a column using a different collation

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

如果您希望在不更改列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,那么您总是可以使用 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;

like运算符接受两个字符串。这些字符串必须具有兼容的排序规则,这里解释了 给你

在我看来,事情变得复杂起来。下面的查询返回一个错误,说明排序规则不兼容:

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”不匹配。

In other words, there is a difference between having no collation and using the default collation. When one side has no collation, then it is "assigned" an explicit collation from the other side.

(当显式排序规则位于左侧时,结果是相同的。)

所有这些关于排序的讨论似乎有点过于复杂。为什么不使用这样的东西:

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

那么无论排序方式如何,您的检查都是不区分大小写的

你可以在 Microsoft SQL Server 管理工作室轻松改变排序。

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

可以对每个项的属性进行更改。

case sensitive