SQL Server 2008外键区分大小写

时间:2012-05-01 13:46:37

标签: sql sql-server

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'但外键是区分大小写的吗?

3 个答案:

答案 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交互式更改列的排序规则(对于大图像而言很抱歉):

enter image description here

答案 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排序规则,其中一些排序规则是区分大小写的。

Selecting a SQL Server Collation