SQL Server 2008外键区分大小写

SQL Server 2008外键区分大小写,sql,sql-server,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”,但外键区分大小写?区分大小写取决于数据库的大

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”,但外键区分大小写?

区分大小写取决于数据库的大小写。它影响一切,比较,外键等

但是,您可以更改特定列上的排序规则设置,以便与它进行区分大小写的比较,而DB的其余部分保持不区分大小写。例如:

ALTER COLUMN Name VARCHAR(50)  
COLLATE SQL_Latin1_General_CP1_CS_AS 
现在,所有与
Name
的比较都将区分大小写

给定区分大小写的排序规则,执行不区分大小写比较的一种方法是在查询中指定一个per列。如果使用此方法动态更改排序规则,您可能还需要熟悉。以下是在查询点指定排序规则转换的示例:

SELECT Name 
FROM MyTable
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll.
可以使用表设计器is SSMS以交互方式更改列的排序规则(对不起,图像太大了):


区分大小写取决于数据库的大小写。它影响一切,比较,外键等

但是,您可以更改特定列上的排序规则设置,以便与它进行区分大小写的比较,而DB的其余部分保持不区分大小写。例如:

ALTER COLUMN Name VARCHAR(50)  
COLLATE SQL_Latin1_General_CP1_CS_AS 
现在,所有与
Name
的比较都将区分大小写

给定区分大小写的排序规则,执行不区分大小写比较的一种方法是在查询中指定一个per列。如果使用此方法动态更改排序规则,您可能还需要熟悉。以下是在查询点指定排序规则转换的示例:

SELECT Name 
FROM MyTable
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll.
可以使用表设计器is SSMS以交互方式更改列的排序规则(对不起,图像太大了):


绝对是。很大程度上取决于所选择的SQL Server排序规则,其中一些排序规则区分大小写或不区分大小写


绝对是。很大程度上取决于所选择的SQL Server排序规则,其中一些排序规则区分大小写或不区分大小写


如果希望外键区分大小写,则只需将列设置为区分大小写(并确保它引用的键使用相同的排序规则)。借用Michael的答案:

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子句(注意,它包含
\u CI\u
而不是
\u CS\u
):


如果希望外键区分大小写,那么只需将列设置为区分大小写(并确保它引用的键使用相同的排序规则)。借用Michael的答案:

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子句(注意,它包含
\u CI\u
而不是
\u CS\u
):


请看这里:不,这不是因为我知道db的大小写敏感度,而是我想知道是否可能有不同的敏感度(一个用于db,一个用于外键)。您对下面的答案提出了一个问题,然后收回了它。不管怎样,我都会回答:只要你的
WHERE
子句不涉及键,是的,你可以对键区分大小写,但不能对其他数据区分WHERE子句。您为键列设置了区分大小写的排序规则,其余数据不区分大小写。如果希望涉及键的where子句不关心大小写敏感度(尽管我不知道为什么),那么使用
where键进行排序,比如“%foo%”@Siva我不明白你的问题。两个不同的WHERE子句使用不同的排序规则提及不同的列?或者col_in_collation_A=col_in_collation_B?像任何排序规则冲突一样,您需要处理它。您可以告诉任何列或表达式在特定的排序规则中进行解释。@我相信这取决于排序规则是否兼容。很多都不是,在这种情况下,您会遇到排序规则冲突错误,需要通过在一列或另一列上指定排序规则来解决。我从未听说有优先权,但我从未对此做过任何研究,所以这可能只是无知。看这里:不,这不是因为我知道db的大小写敏感度,但我想知道是否可能有不同的敏感度(一个用于db,一个用于外键)你问了一个关于下面答案的问题,然后收回它。不管怎样,我都会回答:只要你的
WHERE
子句不涉及键,是的,你可以对键区分大小写,但不能对其他数据区分WHERE子句。您为键列设置了区分大小写的排序规则,其余数据不区分大小写。如果希望涉及键的where子句不关心大小写敏感度(尽管我不知道为什么),那么使用
where键进行排序,比如“%foo%”@Siva我不明白你的问题。两个不同的WHERE子句使用不同的排序规则提及不同的列?或者col_in_collation_A=col_in_collation_B?像任何排序规则冲突一样,您需要处理它。您可以告诉任何列或表达式在特定的排序规则中进行解释。@我相信这取决于排序规则是否兼容。很多都不是,在这种情况下,您会遇到排序规则冲突错误,需要通过在一列或另一列上指定排序规则来解决。我从未听说有优先权,但我从未对此做过任何研究,所以这可能只是无知。FWIW您没有真正解决如何处理针对此列的查询(例如,
WHERE Name='BoB'
)不区分大小写,这是问题的一部分。FWIW您没有真正说明如何处理针对此列的查询(例如,
其中Name='BoB'
),这是问题的一部分,不区分大小写。