查询
SELECT *
from Table_2
WHERE name like ('Joe');
输出
1 100 Joe 2 200 JOE 3 300 jOE 4 400 joe
为什么不区分大小写?
答案 0 :(得分:6)
问题:
查询不区分大小写
原因:列'名称'具有不区分大小写(CI
)排序规则。
解决方案:您必须使用CS
归类:SELECT * FROM fn_helpcollations() WHERE description LIKE N'%case-sensitive%'
。
注意:存在数据库归类和列级排序规则。此外,还有一个服务器级别的排序规则。
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation
/*
-- Sample output (my database)
DatabaseCollation
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
SELECT col.collation_name AS ColumnCollation
FROM sys.columns col
WHERE col.object_id = OBJECT_ID(N'dbo.Table_2')
AND col.name = N'Name'
/*
-- Sample output (my database)
ColumnCollation
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
只需更改数据库归类将 NOT 更改现有用户表和列的归类:
此语句不会更改任何列中的列的排序规则 现有的用户定义表。这些可以通过使用来改变 ALTER TABLE的COLLATE子句。
更改数据库归类后,上述查询的输出将为:
/*
DatabaseCollation -- changed
----------------------------
SQL_Latin1_General_CP1_CS_AS
*/
/*
ColumnCollation -- no change
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/
并且,如您所见,列Name
的排序规则仍为CI。
此外,更改数据库归类将仅影响新创建的表和列。
因此,更改数据库归类可能会产生奇怪的结果(在我的意见中),因为一些[N][VAR]CHAR
列将是CI,新列将是CS。
详细解决方案#1:如果只有Name
列的一些查询需要CS
,那么我将重写这些查询的WHERE
子句:
SELECT Name
FROM dbo.Table_2
WHERE Name LIKE 'Joe' AND Name LIKE 'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS
这将对SQL Server进行更改,以便在列Index Seek
上执行Name
(在列Name
上有一个索引)。此外,由于以下谓词Predicate
,执行计划将包含隐式转换(请参阅Index Seek
的{{1}}属性)。
详细解决方案#2:如果列Name = N'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS
的所有查询都需要为CS,那么我将仅更改列Name
的排序规则:
Name
答案 1 :(得分:3)
如果您希望查询仅在少数情况下区分大小写,则可以尝试以下查询:
SELECT *
FROM TableName
where Col1 = 'abcdEfhG' COLLATE SQL_Latin1_General_CP1_CS_AS
只需在查询前添加“COLLATE SQL_Latin1_General_CP1_CS_AS”即可。
答案 2 :(得分:1)
这是您的数据库配置为不区分大小写。
为了改变这个:
例如,如果您正在使用:
将其更改为:
如果您想了解有关排序规则的更多信息,请查看this主题下的已接受答案。
<强>更新强>
请注意,由于@BogdanSahlean已经注意到此解决方案适用于新创建的对象,但不适用于现有的表和列。
来自MSDN:
您可以更改在a中创建的任何新对象的排序规则 用户数据库使用ALTER DATABASE的COLLATE子句 声明。此语句不会更改列的排序规则 在任何现有的用户定义表中。这些可以通过使用来改变 ALTER TABLE的COLLATE子句。