SQL Server检查区分大小写?

时间:2009-09-11 14:18:50

标签: sql sql-server tsql case-sensitive

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

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

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

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

7 个答案:

答案 0 :(得分:70)

可以在各个级别设置整理:

  1. 服务器
  2. 数据库
  3. 因此,您可以在Case Insensitive数据库中拥有区分大小写的列。我还没有遇到过针对单列数据的区分大小写的业务案例的情况,但我想可能存在。

    检查服务器整理

    SELECT SERVERPROPERTY('COLLATION')
    

    检查数据库整理

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

    检查列整理

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

答案 1 :(得分:33)

如果使用默认排序规则选项安装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,你可以尝试这种解决方法,这可能会有更多的性能损失(你应该只得到FIRST匹配的结果):

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' 

答案 2 :(得分:7)

SQL Server通过COLLATION确定区分大小写。

COLLATION可以在不同级别设置。

  1. 服务器级
  2. 数据库级
  3. 列级
  4. 表达水平
  5. 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()
    

    你应该看到这样的事情。

    enter image description here

    您始终可以使用WHERE子句进行过滤,仅查看COLLATION的说明。

    您可以找到归类列表here

答案 3 :(得分:4)

您对整理很感兴趣。您可以根据此代码段构建一些内容:

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

<强>更新
根据您的编辑 - 如果@test@TEST可以引用两个不同的变量,那么它不是SQL Server。如果您发现相同变量不等于自身的问题,请检查该变量是否为NULL,因为NULL = NULL返回“false”。

答案 4 :(得分:2)

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

输入:sp_help <tablename>

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

然后输入查询,如:

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

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

答案 5 :(得分:1)

  

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

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

;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;)。

答案 6 :(得分:-2)

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