SQL Server Like 查询不区分大小写

2024-05-16

Query

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

Output



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

为什么不区分大小写?


Problem:

查询不区分大小写

原因:列“名称”不区分大小写(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 http://msdn.microsoft.com/en-us/library/ms175835.aspx

After 更改数据库排序规则,上述查询的输出将是:

/*
DatabaseCollation -- changed
----------------------------
SQL_Latin1_General_CP1_CS_AS
*/

/*
ColumnCollation -- no change
----------------------------
SQL_Latin1_General_CP1_CI_AS
*/

并且,正如您所看到的列的排序规则Name仍然是 CI。

此外,更改数据库排序规则只会影响新创建的表和列。 因此,更改数据库排序规则可能会产生奇怪的结果(在我的opinion)因为有些[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) 因为以下谓词Name = N'Joe' COLLATE SQL_Latin1_General_CP1_CS_AS.

详细解决方案#2:如果所有查询都针对列Name需要是 CS 那么我将仅更改列的排序规则Name thus:

-- Drop all objects that depends on this column (ex. indexes, constraints, defaults)
DROP INDEX IX_Table_2_Name ON dbo.Table_2

-- Change column's collation
ALTER TABLE dbo.Table_2
ALTER COLUMN Name VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS
-- Replace VARCHAR(50) with proper data type and max. length
-- Replace COLLATE SQL_Latin1_General_CP1_CS_AS with the right CS collation

-- Recreate all objects that depends on column Name (ex. indexes, constraints, defaults)
CREATE INDEX IX_Table_2_Name ON dbo.Table_2 (Name)

-- Test query
SELECT  Name 
FROM    dbo.Table_2
WHERE   Name LIKE 'Joe'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server Like 查询不区分大小写 的相关文章

随机推荐