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


99

有关LIKE运算符文档中,没有任何有关其区分大小写的信息。是吗?如何启用/禁用它?

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


14
这取决于您的列(或数据库)的排序规则。如果是大小写敏感的,则LIKE是区分大小写的,如果不是,那么LIKE是不是
Lamak


你的目标是什么?您要区分大小写还是不区分大小写?
亚伦·

1
区分大小写默认为该列上的排序规则,默认为数据库上的排序规则。大多数情况下它都是可取的,您想走哪条路?
托尼·霍普金森

Answers:


101

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

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

类似的排序规则sql_latin1_general_cp1_ci_as规定了应如何处理列的内容。CI代表不区分大小写,AS代表重音。

有关排序规则的完整列表,请访问https://msdn.microsoft.com/zh-cn/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

5
似乎字符范围[A-Z]始终不区分大小写。[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]但是似乎遵循排序规则。
jumxozizi

1
另外,您可以使用以下查询类似的特定列的大小写:select COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn'
Jeppe Stig Nielsen

@jumxozizi我将您的建议添加到了答案中。
John Zabroski

@JeppeStigNielsen我将您的建议添加到了答案中。
John Zabroski

18

所有关于归类的讨论似乎有些复杂。为什么不只使用以下内容:

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

然后您的检查不区分大小写


10
因为这是不可持久的。您的示例使用变量和前导通配符。但是对不区分大小写的排序规则索引的列like 'a%'可以使用索引,而upper版本则不能。
马丁·史密斯

3
问题是like操作员是否区分大小写。
jumxozizi

您需要知道排序规则,否则这样做可能毫无意义。例如,如果要查询的列是否使用了Latin1_General_CI_AS,则执行UPPER(@@VALUE) NOT LIKE '%SOMETHING%'@@COLUMN NOT LIKE '%SOMETHING%'不相关:结果将相同。
rsenna '18

13

您可以在定义表时定义排序规则顺序。如果您定义区分大小写的顺序,那么您的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


12

如果要实现区分大小写的搜索而不更改列/数据库/服务器的排序规则,则可以始终使用该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;

注意,如果使用上一个查询WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%',它将返回,John因为在此排序规则J中,大写j字母介于小写和小写之间k。好像aAbBcC...jJkKlLmM...这并不明显。Latin1_General_BIN带LIKE运算符的范围搜索似乎更可预测。
wqw

7

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

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

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


您是否可以针对不是系统对象(例如INFORMATION_SCHEMA.TABLES)的表重现错误?
亚伦·

@AaronBertrand。。。我可以。数据库是否损坏;)?
Gordon Linoff

不知道,我现在在移动设备上,无法启动Windows VM。我只是不知道您的整个描述在技术上是准确的。
亚伦·

4

尝试跑步

SELECT SERVERPROPERTY('COLLATION')

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



0

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

  • 右键单击表格->设计。
  • 选择您的列,将i列属性向下滚动到Collat​​ion。
  • 通过选中“区分大小写”来设置您的排序首选项
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.