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'但外键是区分大小写的吗?
答案 0 :(得分:6)
区分大小写由数据库的collation settings确定。它影响一切,比较,外键等......
但是,您可以更改特定列或列的排序规则设置,以使其与区分大小写进行比较,而其余数据库保持不区分大小写。例如:
ALTER COLUMN Name VARCHAR(50)
COLLATE SQL_Latin1_General_CP1_CS_AS
现在与Name
的所有比较都区分大小写。
在给定区分大小写的排序规则的情况下,执行不区分大小写的比较的一种方法是在查询中指定每列collation cast。如果您使用此方法动态更改排序规则,您可能还希望熟悉collation precedence。以下是在查询点指定的排序规则转换的示例:
SELECT Name
FROM MyTable
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll.
可以使用表设计器以SSMS交互式更改列的排序规则(对于大图像而言很抱歉):
答案 1 :(得分:3)
如果希望外键区分大小写,则只需将列设置为区分大小写(并确保它引用的键使用相同的排序规则)。借用迈克尔答案的整理:
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
答案 2 :(得分:0)
绝对。很大程度上取决于所选择的SQL Server排序规则,其中一些排序规则是区分大小写的。