116

有关 LIKE 运算符的文档中,没有说明它的大小写敏感性。是吗?如何启用/禁用它?

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

4

8 回答 8

124

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

执行 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
于 2013-02-19T16:40:48.980 回答
21

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

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

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

于 2013-07-18T14:32:56.297 回答
15

如果您想在不更改列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,您始终可以使用该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;
于 2013-02-19T16:52:30.303 回答
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
);

这是一个关于 sqlfiddle 的快速演示,显示了使用LIKE.

于 2013-02-19T16:30:44.363 回答
8

运算符采用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”不匹配。

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

(当显式排序规则在左侧时,结果相同。)

于 2013-02-19T16:56:39.827 回答
4

试试跑步,

SELECT SERVERPROPERTY('COLLATION')

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

于 2013-02-19T16:29:56.483 回答
1

您可以更改每个项目的属性。

区分大小写

于 2018-09-06T01:31:34.830 回答
0

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

  • 右键单击表格-> 设计。
  • 选择您的列,向下滚动 i 列属性到排序规则。
  • 通过选中“区分大小写”设置您的排序首选项
于 2018-04-13T08:23:54.783 回答