在保持字符串区分大小写的同时,可以使数据库对象不区分大小写吗?

Wou*_*ter 3 sql-server collation sql-server-2014 case-sensitive

在 Microsoft SQL Server (2014) 中,可以在不区分大小写和区分大小写的排序规则之间进行选择。

我使用区分大小写的排序规则的原因是"test" = "TEST"return false

然而,我想保留的是,当表"TEST"存在时,编写类似的查询select * from test;仍然有效。当数据库有区分大小写的排序规则时,它不会,因为我需要像这样写select * from TEST;

有没有办法分别设置“对象整理”和“字符串整理”?

Sol*_*zky 5

大多数情况下是“是”,这取决于您希望一切正常工作的“自动”程度。

第一:数据库标识符排序规则(即对象名称、列名称、索引名称等)取自数据库的默认排序规则。这将确定诸如sys.objects.name等的列的排序规则。为此,您可以创建或更改数据库以具有不区分大小写的排序规则,例如Latin1_General_100_CI_AS_SC。这将允许您拥有一个TEST在查询中有效的表,例如select * from test;.

服务器范围的标识符排序规则(例如数据库名称)由实例的默认排序规则处理。

第二:如果数据库的默认排序规则不区分大小写,那么完全是字符串文字和/或变量和/或输出参数和/或 UDF 返回值的表达式将被视为不区分大小写。对于这些表达式,您需要使用COLLATE子句覆盖每个表达式的默认行为。

例如:

/* take database default collation behavior */
IF ('test' = 'TEST')
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- ? result depends on the default collation of the "current" database ?


/* force case-sensitive */
IF ('test' = 'TEST' COLLATE Latin1_General_100_CS_AS_SC)
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- Case-Sensitive


/* force case-insensitive */
IF ('test' = 'TEST' COLLATE Latin1_General_100_CI_AS_SC)
BEGIN
  PRINT 'Case-Insensitive';
END;
ELSE
BEGIN
  PRINT 'Case-Sensitive';
END;
-- Case-Insensitive
Run Code Online (Sandbox Code Playgroud)

字符串列与字符串文字或变量之间的表达式将使用字符串列的排序规则,如果列的排序规则区分大小写,则表达式将被评估为区分大小写,而无需使用COLLATE子句。

默认情况下,指定COLLATE子句的新创建的列将继承数据库的默认排序规则。在这种情况下,您需要为所有 4 个类别(加上支持补充字符)敏感的COLLATE Latin1_General_100_CS_AS_KS_WS_SC所有VARCHAR/NVARCHAR列指定类似的内容。

请注意:使用二进制排序规则(即Latin1_General_100_BIN2)来获得重音/大小写/假名/宽度敏感排序规则时要非常谨慎;二进制排序规则并不真正区分大小写。