SQL Server 2008 是否有可能具有不区分大小写的数据,例如以下将返回数据...
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
如果 mytable.mycolumn 的值为 'CASE' 但外键区分大小写?
SQL Server 2008 是否有可能具有不区分大小写的数据,例如以下将返回数据...
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
如果 mytable.mycolumn 的值为 'CASE' 但外键区分大小写?
区分大小写由数据库的排序规则设置确定。它影响一切,比较,外键等......
但是,您可以更改特定列或列的排序规则设置,以便与它进行比较区分大小写,而数据库的其余部分保持不区分大小写。例如:
ALTER COLUMN Name VARCHAR(50)
COLLATE SQL_Latin1_General_CP1_CS_AS
现在所有的比较Name
都将区分大小写。
在给定区分大小写排序规则的情况下执行不区分大小写比较的一种方法是将每列排序规则转换指定为查询的一部分。如果您使用此方法动态更改排序规则,您可能还想熟悉排序规则优先级。这是在查询点指定的排序规则转换的示例:
SELECT Name
FROM MyTable
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll.
可以使用 Table Designer is SSMS 以交互方式更改列的排序规则(对不起,大图):
如果您希望外键区分大小写,则只需将列设置为区分大小写(并确保它引用的键使用相同的排序规则)。从迈克尔的回答中借用整理:
USE tempdb;
GO
CREATE TABLE dbo.foo
(
[key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS
PRIMARY KEY
);
CREATE TABLE dbo.bar
(
[key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS
FOREIGN KEY REFERENCES dbo.foo([key])
);
INSERT dbo.foo SELECT 'Bob';
INSERT dbo.foo SELECT 'bOB';
INSERT dbo.foo SELECT 'BOB';
GO
-- fails:
INSERT dbo.bar SELECT 'bob';
GO
-- succeeds:
INSERT dbo.bar SELECT 'Bob';
GO
如果您希望对同一列的查询不区分大小写,则只需指定一个 COLLATE 子句(注意它包含_CI_
而不是_CS_
):
SELECT COUNT(*) FROM dbo.foo
WHERE [key] = 'Bob';
----
1
SELECT COUNT(*) FROM dbo.foo
WHERE [key] COLLATE SQL_Latin1_General_CP1_CI_AS = 'Bob';
----
3
绝对地。很大程度上取决于选择的 SQL Server 排序规则,其中一些区分大小写或不区分大小写。