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'