【问题标题】:How to determine if connected database is case-sensitive如何确定连接的数据库是否区分大小写
【发布时间】:2015-09-17 04:28:02
【问题描述】:

我需要以编程方式 (C#) 确定连接的数据库(可能是 Oracle 11g 或 Sql Server 2008 及更高版本)是否已设置为区分大小写,因此我知道何时比较两个字符串(一个从数据库中检索, 由用户输入)是否进行区分大小写的比较。

这可能吗?如果可以,我该怎么做?

TIA

【问题讨论】:

标签: c# sql-server oracle


【解决方案1】:

您可以只使用 case 和 select

SELECT CASE WHEN 'A' = 'a' THEN 'Insensitive' ELSE 'Sensitive' END

以上对于整个数据库会话来说是非常普遍的。更具体地说,您必须深入了解每个 DBMS 的数据库配置。

以下检查特定于 Oracle 的区分大小写配置:

SELECT CASE WHEN COUNT(*) = 2 THEN 'Insensitive' ELSE 'Sensitive' END
FROM NLS_SESSION_PARAMETERS
WHERE (PARAMETER = 'NLS_COMP' AND VALUE = 'LINGUISTIC')
    OR (PARAMETER = 'NLS_SORT' AND VALUE = 'BINARY_CI')

以下检查不同级别的特定 SQL Server 排序规则:

-- Server level
SELECT CASE WHEN SERVERPROPERTY('COLLATION') LIKE '%_CI_%' THEN 'Insensitive' ELSE 'Sensitive' END

-- Database level
SELECT CASE WHEN DATABASEPROPERTYEX('AdventureWorks', 'Collation') LIKE '%_CI_%' THEN 'Insensitive' ELSE 'Sensitive' END

-- Column level
SELECT CASE WHEN COLLATION_NAME LIKE '%_CI_%' THEN 'Insensitive' ELSE 'Sensitive' END
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name
    AND COLUMN_NAME = @column_name

这对于检查不区分大小写的排序规则并不详尽,但基于SELECT name, description FROM ::fn_helpcollations(),它似乎还不错。

SQL Server 排序规则的参考(如对 OP 的评论所述)

【讨论】:

  • 整洁。现在有一个 Oracle 版本(Gulp)
  • 这应该适用于任何一个,因为两者都支持CASE。我相信 Oracle 默认情况下区分大小写。如果您使用的是实体框架,那么只需使用上下文的数据库属性直接运行 SQL 查询。
  • 更新了每个 dbms 的更具体的答案。您必须谨慎,因为每个 DBMS 处理区分大小写的方式非常不同,并且配置可能会根据您正在处理的服务器、数据库甚至列而有所不同。
  • Oracle 要求 From Dual 子句,在末尾加上一个分号,除此之外都一样。
猜你喜欢
  • 2014-02-02
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多