【问题标题】:SQL Server check case-sensitivity?SQL Server 检查是否区分大小写?
【发布时间】:2010-11-27 12:35:29
【问题描述】:

如何检查 SQL Server 中的数据库是否区分大小写?我之前一直在运行查询:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

但我正在寻找其他方法,因为这实际上给我带来了过去的问题。

编辑 - 更多信息: 现有产品具有许多预先编写的存储过程。在存储过程中@test != @TEST 取决于服务器本身的敏感性。所以我正在寻找的是检查服务器敏感度的最佳方法。

【问题讨论】:

  • 如有疑问,请使用 UPPER 将比较的两边都改为大写...

标签: sql sql-server tsql case-sensitive


【解决方案1】:

排序规则可以设置在不同的级别:

  1. 服务器
  2. 数据库
  3. 列

因此,您可以在不区分大小写的数据库中有一个区分大小写的列。我还没有遇到过可以为单列数据区分大小写的业务案例,但我想有可能。

检查服务器排序规则

SELECT SERVERPROPERTY('COLLATION')

检查数据库排序规则

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

检查列排序规则

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

【讨论】:

  • 为了完整起见,您也可以使用SELECT * FROM foo where x = 'y' COLLATE sql_latin1_general_cp1_cs_as在SQL中设置排序规则
  • 只是在拼图中再添加一块:如果排序规则名称包含 CI 则不区分大小写,如果包含 CS 则区分大小写. Read more in MSDN
  • 有很多东西是区分大小写的,比如 URL、密码等等,区分大小写的列的例子。
  • @Gordon 我希望您不会在数据库中以明文形式存储密码!
  • @gdoron:我还没有看到区分大小写的 URL。 stackoverflow.com/questions/7996919/… 。当然,get 部分可以是,但不是域。
【解决方案2】:

如果您使用默认排序规则选项安装 SQL Server,您可能会发现以下查询返回相同的结果:

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

您可以通过在列级别强制排序来更改您的查询:

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

由于更改此设置会影响应用程序和 SQL 查询,因此我将首先隔离此测试。从 SQL Server 2000 开始,您可以轻松地运行 ALTER TABLE 语句来更改特定列的排序顺序,强制它区分大小写。首先,执行以下查询以确定您需要将其更改回:

EXEC sp_help 'mytable' 

在默认情况下,第二个记录集应包含以下信息:

Column_Name 排序规则


mycolumn SQL_Latin1_General_CP1_CI_AS

无论“排序规则”列返回什么,您现在都知道在进行以下更改后需要将其改回什么,这将强制区分大小写:

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

如果这搞砸了,您可以将其改回来,只需发出一个新的 ALTER TABLE 语句(确保将我的 COLLATE 标识符替换为您之前找到的那个):

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

如果您在使用 SQL Server 7.0 时遇到问题,可以尝试这种解决方法,这可能会稍微影响性能(您应该只获得第一次匹配的结果):

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

【讨论】:

    【解决方案3】:

    SQL 服务器通过COLLATION 确定区分大小写。

    COLLATION可以设置不同的级别。

    1. 服务器级
    2. 数据库级
    3. 列级
    4. 表达式级

    Here is the MSDN reference.

    如Raj More's answer 中所述,您可以检查每个级别的COLLATION。

    检查服务器排序规则

    SELECT SERVERPROPERTY('COLLATION')
    

    检查数据库排序规则

    SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
    

    检查列排序规则

    select table_name, column_name, collation_name
    from INFORMATION_SCHEMA.COLUMNS
    where table_name = @table_name
    

    检查表达式排序规则

    对于表达式级别COLLATION,您需要查看表达式。 :)

    它通常位于表达式的末尾,如下例所示。

    SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
    

    归类说明

    要获取每个 COLLATION 值的描述,请尝试此操作。

    SELECT * FROM fn_helpcollations()
    

    您应该会看到类似这样的内容。

    您始终可以使用WHERE 子句进行过滤并仅查看您的COLLATION 的描述。

    您可以找到排序规则列表here。

    【讨论】:

      【解决方案4】:

      您对排序规则感兴趣。你可以基于这个 sn-p 构建一些东西:

      SELECT DATABASEPROPERTYEX('master', 'Collation');
      

      更新
      根据您的编辑 — 如果 @test 和 @TEST 可以引用两个不同的变量,则它不是 SQL Server。如果您发现 same 变量不等于自身的问题,请检查该变量是否为 NULL,因为 NULL = NULL 返回 `false。

      【讨论】:

      【解决方案5】:

      使用已创建的表的最佳方法是, 转到 Sql Server 查询编辑器

      输入:sp_help &lt;tablename&gt;

      这将显示表格的结构,请参阅 COLLATE 列下所需字段的详细信息。

      然后输入如下查询:

      SELECT myColumn FROM myTable  
      WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
      

      可能是不同的字符架构 SQL_Latin1_General_CP1_CI_AS>,因此最好找出针对该列使用的确切架构。

      【讨论】:

        【解决方案6】:

        如何检查 SQL Server 中的数据库是否区分大小写?

        您可以使用以下查询来返回您的通知数据库是否区分大小写或二进制排序(结果为空):

        ;WITH collations AS (
            SELECT 
                name,
                CASE 
                    WHEN description like '%case-insensitive%' THEN 0 
                    WHEN description like '%case-sensitive%' THEN 1 
                END isCaseSensitive
            FROM 
                sys.fn_helpcollations()
        )
        SELECT *
        FROM collations
        WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));
        

        更多信息请阅读this MSDN information ;)。

        【讨论】:

          【解决方案7】:

          SQL Server 不区分大小写。 SELECT * FROM SomeTable 与 SeLeCT * frOM soMetaBLe 相同。

          【讨论】:

          • 它的措辞方式,听起来他在问它是否区分大小写。我认为那里的反对票有点不公平。
          • 他提供的查询很清楚他在问什么。
          • 查看 OPs 最近的编辑,他在谈论混合大小写的参数和变量,我认为 Mark 在这里有一个有效的观点。它不仅仅是列中的数据。转到 +1。
          • Did +1 but may expand as 'SQL Server is not casesensitive' 在提及数据比较时作为广义陈述并不完全正确
          • “SQL Server 不区分大小写”不正确。 SQL Server 是否对数据、或模式(例如表名、字段名)区分大小写取决于排序规则设置。请记住,表名/字段名只是元数据,它也受排序规则设置的影响。
          猜你喜欢
          • 2011-03-24
          • 1970-01-01
          • 2013-02-04
          • 1970-01-01
          • 2015-07-23
          • 1970-01-01
          • 2020-10-21
          • 1970-01-01
          • 2010-09-14
          相关资源
          最近更新 更多