54

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

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

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

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

4

7 回答 7

78

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

  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
于 2009-09-11T14:32:21.887 回答
35

如果您使用默认排序选项安装 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 排序规则


我的列 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' 
于 2009-09-11T15:07:36.703 回答
11

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

COLLATION可以设置在不同的级别。

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

这是 MSDN 参考。

可以检查Raj More 的回答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.

您可以在此处找到排序规则列表。

于 2015-04-21T12:40:00.720 回答
4

您对排序规则感兴趣。您可以基于此代码段构建一些东西:

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

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

于 2009-09-11T14:21:57.827 回答
2

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

类型:sp_help <tablename>

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

然后输入查询,如:

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

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

于 2014-07-18T10:33:17.423 回答
1

如何检查 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'));

有关更多信息,请阅读此 MSDN 信息;)。

于 2016-12-21T15:37:21.743 回答
-3

SQL Server 不区分大小写。SELECT * FROM SomeTable是一样的SeLeCT * frOM soMetaBLe

于 2009-09-11T14:20:58.420 回答