SQL Server Like Query不区分大小写

时间:2014-06-29 05:51:25

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

查询

SELECT  * 
from Table_2  
WHERE  name like ('Joe');

输出

1   100 Joe
2   200 JOE
3   300 jOE
4   400 joe

为什么不区分大小写?

3 个答案:

答案 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子句。

Source

更改数据库归类后,上述查询的输出将为:

/*
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

enter image description here

这将对SQL Server进行更改,以便在列Index Seek上执行Name(在列Name上有一个索引)。此外,由于以下谓词Predicate,执行计划将包含隐式转换(请参阅Index Seek的{​​{1}}属性)。

详细解决方案#2:如果列Name = N'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS的所有查询都需要为CS,那么我将仅更改列Name的排序规则:

Name

enter image description here

答案 1 :(得分:3)

如果您希望查询仅在少数情况下区分大小写,则可以尝试以下查询:

SELECT *
FROM TableName
where Col1 = 'abcdEfhG' COLLATE SQL_Latin1_General_CP1_CS_AS

只需在查询前添加“COLLATE SQL_Latin1_General_CP1_CS_AS”即可。

答案 2 :(得分:1)

这是您的数据库配置为不区分大小写。

为了改变这个:

  • 打开 SSMSE
  • 在您的数据库中
  • 右键单击,然后选择属性
  • 在左侧窗格中选择选项
  • 整理下的值更改为您当前使用的相同值,仅使用CS(区分大小写)而不是CI(不区分大小写)

例如,如果您正在使用:

  • SQL_Latin1_General_CP1_的 CI _AS

将其更改为:

  • SQL_Latin1_General_CP1_的 CS _AS

如果您想了解有关排序规则的更多信息,请查看this主题下的已接受答案。

enter image description here

<强>更新
请注意,由于@BogdanSahlean已经注意到此解决方案适用于新创建的对象,但不适用于现有的表和列。
来自MSDN:

  

您可以更改在a中创建的任何新对象的排序规则   用户数据库使用ALTER DATABASE的COLLATE子句   声明。此语句不会更改列的排序规则   在任何现有的用户定义表中。这些可以通过使用来改变   ALTER TABLE的COLLATE子句。