在有关LIKE操作文档 ,没有被告知有关它的大小写。 是吗? 如何启用/禁用它?
我查询varchar(n)
列上的Microsoft SQL Server 2005安装,如果该事项。
在有关LIKE操作文档 ,没有被告知有关它的大小写。 是吗? 如何启用/禁用它?
我查询varchar(n)
列上的Microsoft SQL Server 2005安装,如果该事项。
这并不是说是大小写敏感的操作,它是列本身。
当执行一个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
你有一个选项,以确定您的表的时间来定义排序顺序 。 如果定义区分大小写的顺序,你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
。
所有这些谈论整理显得有点过于复杂。 为什么不直接使用这样的:
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
运营商需要两个字符串。 这些字符串必须有兼容的排序规则,这是解释在这里 。
在我看来,事情则变得复杂。 下面的查询返回一个错误,指出排序规则是不相容的:
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世界。
换句话说,存在具有无整理和使用默认排序规则之间的差。 当一方没有归类,则它是“分配”从另一侧的显式排序规则。
(结果是相同的,当明确的核对是在左边。)
尝试运行,
SELECT SERVERPROPERTY('COLLATION')
然后看看你的归类区分大小写。
您可以从每个项目的属性更改。
您可以在Microsoft SQL Server Management Studio中容易改变排序规则。