是LIKE操作区分大小写与MSSQL服务器?(Is the LIKE operator case-s

2019-07-20 04:02发布

在有关LIKE操作文档 ,没有被告知有关它的大小写。 是吗? 如何启用/禁用它?

我查询varchar(n)列上的Microsoft SQL Server 2005安装,如果该事项。

Answer 1:

这并不是说是大小写敏感的操作,它是列本身。

当执行一个SQL Server系统中的默认排序规则被选择的实例。 除非另有明确提及(检查勘条款波纹管),当一个新的数据库中创建它继承了实例的整理和创建一个新的列时,它继承了它所属的数据库中的归类。

像排序规则sql_latin1_general_cp1_ci_as决定如何列的内容应及时治疗。 CI表示不区分大小写,AS表示重音敏感。

归类的完整列表,请https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx

(一)要检查实例排序规则

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


Answer 2:

你有一个选项,以确定您的表的时间来定义排序顺序 。 如果定义区分大小写的顺序,你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



Answer 3:

所有这些谈论整理显得有点过于复杂。 为什么不直接使用这样的:

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

那么你的检查是不区分大小写任何排序规则



Answer 4:

如果你想达到一个区分大小写的搜索,而不更改列/数据库/服务器的整理,你可以随时使用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;


Answer 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

在这里随机机,默认排序规则是SQL_Latin1_General_CP1_CI_AS 。 下面的查询是成功的,但不返回行:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

值“ABC”和“ABC”不匹配的情况下,sensitve世界。

换句话说,存在具有无整理和使用默认排序规则之间的差。 当一方没有归类,则它是“分配”从另一侧的显式排序规则。

(结果是相同的,当明确的核对是在左边。)



Answer 6:

尝试运行,

SELECT SERVERPROPERTY('COLLATION')

然后看看你的归类区分大小写。



Answer 7:

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



Answer 8:

您可以在Microsoft SQL Server Management Studio中容易改变排序规则。

  • 右键点击表 - >设计。
  • 选择你的专栏中,我列属性向下滚动到整理。
  • 通过检查设置您的偏好排序“区分大小写”


文章来源: Is the LIKE operator case-sensitive with MSSQL Server?