在 Microsoft SQL Server (2014) 中,可以在不区分大小写和区分大小写排序规则之间进行选择。
我使用区分大小写排序规则的原因是"test" = "TEST"
return false
。
然而,我想保留的是,当表"TEST"
存在时,编写类似的查询select * from test;
仍然有效。当数据库有区分大小写的排序规则时,它没有,因为我需要像这样写select * from TEST;
有没有办法分别设置“对象排序规则”和“字符串排序规则”?
在 Microsoft SQL Server (2014) 中,可以在不区分大小写和区分大小写排序规则之间进行选择。
我使用区分大小写排序规则的原因是"test" = "TEST"
return false
。
然而,我想保留的是,当表"TEST"
存在时,编写类似的查询select * from test;
仍然有效。当数据库有区分大小写的排序规则时,它没有,因为我需要像这样写select * from TEST;
有没有办法分别设置“对象排序规则”和“字符串排序规则”?
主要是“是”,这取决于您希望一切正常工作的“自动”程度。
第一:数据库标识符排序规则(即对象名称、列名称、索引名称等)取自数据库的默认排序规则。这将确定诸如
sys.objects.name
等列的排序规则。因此,要执行此操作,您可以创建或更改数据库以具有不区分大小写的排序规则,例如Latin1_General_100_CI_AS_SC
. 这将允许您拥有一个TEST
在查询中有效的表,例如select * from test;
.服务器范围的标识符排序规则(例如数据库名称)由实例的默认排序规则处理。
第二:如果数据库的默认排序规则不区分大小写,则完全是字符串文字和/或变量和/或输出参数和/或 UDF 返回值的表达式将被视为不区分大小写。对于这些表达式,您需要使用
COLLATE
子句覆盖每个表达式的默认行为。例如:
字符串列与字符串文字或变量之间的表达式将使用字符串列的排序规则,如果列的排序规则区分大小写,则表达式将被评估为区分大小写,而无需使用
COLLATE
子句。默认情况下,未指定
COLLATE
子句的新创建的列将继承数据库的默认排序规则。在这种情况下,您需要COLLATE Latin1_General_100_CS_AS_KS_WS_SC
为所有VARCHAR
/NVARCHAR
列指定您希望在所有 4 个类别中敏感的内容(加上支持补充字符)。请注意:使用二进制排序规则(即
Latin1_General_100_BIN2
)获取重音/大小写/假名/宽度敏感排序规则时要非常谨慎;二进制排序规则不是真正区分大小写的。