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

Mar*_*cel 86 sql varchar sql-server-2005 sql-like

关于LIKE运算符文档中,没有告诉它的区分大小写.是吗?如何启用/禁用它?

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

lol*_*lol 89

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

执行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')
Run Code Online (Sandbox Code Playgroud)

(b)检查数据库整理

select databasepropertyex('databasename', 'collation') sqlcollation
Run Code Online (Sandbox Code Playgroud)

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

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 
Run Code Online (Sandbox Code Playgroud)

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

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)
Run Code Online (Sandbox Code Playgroud)

(e)修改列整理

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
Run Code Online (Sandbox Code Playgroud)

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

也可以动态更改列排序规则以进行字符串比较,但在生产环境中这是非常不推荐的,因为它非常昂贵.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
Run Code Online (Sandbox Code Playgroud)

  • 似乎`[AZ]`这样的字符范围总是不区分大小写.`[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]但是似乎服从整理. (2认同)

小智 16

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

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
Run Code Online (Sandbox Code Playgroud)

然后,无论整理如何,您的检查都不区分大小写

  • 因为这不是苛刻的.您的示例使用变量和前导通配符.但是对于用不区分大小写的排序规则进行索引的列``''%''可以使用索引而``upper`版本则不能. (10认同)
  • 问题是“ like”运算符是否区分大小写。 (2认同)

das*_*ght 14

您可以选择在定义表时定义归类顺序.如果您定义区分大小写的订单,您的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
);
Run Code Online (Sandbox Code Playgroud)

这是一个关于sqlfiddle快速演示,显示了对搜索的整理顺序的结果LIKE.


Aar*_*and 11

如果要在不更改列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,则始终可以使用该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;
Run Code Online (Sandbox Code Playgroud)

如果您的列/数据库/服务器区分大小写并且您不想要区分大小写的搜索,例如,也可以使用其他方式

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;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在最后一个查询中,如果您使用“WHERE bar COLLATE Latin1_General_CS_AS LIKE '[jk]%'”,它将返回“John”,因为在此排序规则中,大写“J”位于小写“j”和小写“k”之间。就像“aAbBcC...jJkKlLmM...”,这并不明显。看来“Latin1_General_BIN”使用 LIKE 运算符进行范围搜索更可预测。 (3认同)

Ran*_*s1r 5

尝试跑步,

SELECT SERVERPROPERTY('COLLATION')
Run Code Online (Sandbox Code Playgroud)

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


Gor*_*off 5

like操作需要两个字符串.这些字符串必须具有兼容的排序规则,这将在此处进行说明.

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

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

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

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

在案例敏感的世界中,值"abc"和"ABC"不匹配.

换句话说,没有排序规则和使用默认排序规则之间存在差异.当一方没有整理时,则从另一方"分配"一个明确的整理.

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