SQL Server 的 LIKE 运算符是不是区分大小写?
Posted
技术标签:
【中文标题】SQL Server 的 LIKE 运算符是不是区分大小写?【英文标题】:Is the LIKE operator case-sensitive with SQL Server?SQL Server 的 LIKE 运算符是否区分大小写? 【发布时间】:2013-02-04 10:12:25 【问题描述】:在documentation about the LIKE operator 中,没有任何关于它区分大小写的信息。是吗?如何启用/禁用它?
我正在查询varchar(n)
列,安装在 Microsoft SQL Server 2005 上,如果这很重要的话。
【问题讨论】:
这取决于您的列(或数据库)的排序规则。如果区分大小写,则LIKE
区分大小写,如果不区分,则LIKE
不区分
查看有关 SQL-Server 排序规则的文档msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
你的目标是什么?您希望它区分大小写还是不区分大小写?
区分大小写默认为列上的排序规则,该列默认为数据库上的排序规则。大部分都是圆形的,你想走哪条路?
【参考方案1】:
区分大小写的不是运算符,而是列本身。
执行 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
【讨论】:
似乎[A-Z]
之类的字符范围始终不区分大小写。 [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
然而似乎服从排序规则。
另外,您可以使用以下内容查询特定列的区分大小写: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'
@jumxozizi 我已将您的建议添加到答案中。
@JeppeStigNielsen 我已将您的建议添加到答案中。【参考方案2】:
所有关于整理的讨论似乎有点过于复杂。为什么不直接使用类似的东西:
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
那么无论排序规则如何,您的支票都不区分大小写
【讨论】:
因为这不是 sargable。您的示例使用变量和前导通配符。但是对于使用不区分大小写的排序规则索引的列like 'a%'
可以使用索引,而 upper
版本不能。
问题是like
运算符是否区分大小写。
您需要知道排序规则,否则这样做可能毫无意义。例如,如果查询的列使用Latin1_General_CI_AS
,那么执行UPPER(@@VALUE) NOT LIKE '%SOMETHING%'
或@@COLUMN NOT LIKE '%SOMETHING%'
是无关紧要的:结果将是相同的。【参考方案3】:
如果你想在不改变列/数据库/服务器的排序规则的情况下实现区分大小写的搜索,你总是可以使用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 运算符的范围搜索更容易预测。
这是帮助我的答案【参考方案4】:
您可以在定义表格时选择定义排序顺序。如果您定义区分大小写的顺序,您的 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
进行搜索时的整理顺序结果。
【讨论】:
【参考方案5】: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”在区分大小写的世界中不匹配。
换句话说,没有排序规则和使用默认排序规则是有区别的。当一侧没有排序规则时,则从另一侧“分配”一个显式排序规则。
(显式排序在左侧时结果相同。)
【讨论】:
你能针对不是像 INFORMATION_SCHEMA.TABLES 这样的系统对象的表重现错误吗? @AaronBertrand 。 . .我可以。数据库坏了;)? 不知道,我现在在移动设备上,无法启动 Windows VM。我只是不知道您的整个描述在技术上是否准确。【参考方案6】:尝试运行,
SELECT SERVERPROPERTY('COLLATION')
然后找出您的排序规则是否区分大小写。
【讨论】:
【参考方案7】:你可以改变每个项目的属性。
【讨论】:
【参考方案8】:您可以在 Microsoft SQL Server Management Studio 中轻松更改排序规则。
右键单击表格 -> 设计。 选择您的列,向下滚动 i 列属性到排序规则。 通过选中“区分大小写”设置您的排序首选项【讨论】:
以上是关于SQL Server 的 LIKE 运算符是不是区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章