如果您使用默认排序规则选项安装 SQL Server,您可能会发现以下查询返回相同的结果:
CREATE TABLE mytable
(
mycolumn VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT mytable VALUES('Case')
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
您可以通过在列级别强制排序来更改您的查询:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'case'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case'
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SELECT DATABASEPROPERTYEX('<database name>', 'Collation')
由于更改此设置会影响应用程序和 SQL 查询,因此我将首先隔离此测试。从 SQL Server 2000 开始,您可以轻松地运行 ALTER TABLE 语句来更改特定列的排序顺序,强制它区分大小写。首先,执行以下查询以确定您需要将其更改回:
EXEC sp_help 'mytable'
在默认情况下,第二个记录集应包含以下信息:
Column_Name 排序规则
mycolumn SQL_Latin1_General_CP1_CI_AS
无论“排序规则”列返回什么,您现在都知道在进行以下更改后需要将其改回什么,这将强制区分大小写:
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE Latin1_General_CS_AS
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
如果这搞砸了,您可以将其改回来,只需发出一个新的 ALTER TABLE 语句(确保将我的 COLLATE 标识符替换为您之前找到的那个):
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
如果您在使用 SQL Server 7.0 时遇到问题,可以尝试这种解决方法,这可能会稍微影响性能(您应该只获得第一次匹配的结果):
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10))
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'