LIKE运算符是否与MSSQL Server区分大小写?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LIKE运算符是否与MSSQL Server区分大小写?相关的知识,希望对你有一定的参考价值。
在documentation about the LIKE operator中,没有任何关于它的区分大小写的信息。是吗?如何启用/禁用它?
如果重要的话,我在Microsoft SQL Server 2005安装上查询varchar(n)
列。
不是区分大小写的运算符,而是列本身。
执行SQL Server安装时,将为实例选择默认排序规则。除非另外明确提到(检查下面的collate子句),否则在创建新数据库时,它会继承实例的排序规则,并且在创建新列时,它会从其所属的数据库继承排序规则。
像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
您可以选择在定义表时定义归类顺序。如果您定义区分大小写的顺序,则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
);
这是一个quick demo on sqlfiddle,显示了使用LIKE
搜索的整理顺序的结果。
所有关于整理的讨论似乎有点过于复杂。为什么不使用类似的东西:
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
然后,无论整理如何,您的检查都不区分大小写
如果要在不更改列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,则始终可以使用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
运算符需要两个字符串。这些字符串必须具有兼容的排序规则,here对此进行了解释。
在我看来,事情变得复杂了。以下查询返回错误,指出排序规则不兼容:
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”不匹配。
换句话说,没有排序规则和使用默认排序规则之间存在差异。当一方没有整理时,则从另一方“分配”一个明确的整理。
(当显式排序规则位于左侧时,结果相同。)
试试跑步,
SELECT SERVERPROPERTY('COLLATION')
然后查看您的校对是否区分大小写。
您可以更改每个项目的属性。
您可以轻松更改Microsoft SQL Server Management Studio中的排序规则。
- 右键单击表 - >设计。
- 选择列,向下滚动i列属性为Collation。
- 通过选中“区分大小写”来设置排序首选项
以上是关于LIKE运算符是否与MSSQL Server区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章