SQL Server检查是否区分大小写?

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

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

但是我正在寻找其他方式,因为这实际上在过去给了我很多问题。

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

Kyle asked 2020-02-22T11:39:00Z
7个解决方案
71 votes

可以在各种级别上设置排序规则:

  1. 服务器
  2. 数据库

因此,您可以在不区分大小写的数据库中包含一个区分大小写的列。 我还没有遇到过可以针对单个数据列的大小写敏感性进行业务案例研究的情况,但是我想可以。

检查服务器排序规则

SELECT SERVERPROPERTY('COLLATION')

检查数据库整理

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

检查列排序规则

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Raj More answered 2020-02-22T11:39:40Z
33 votes

如果使用默认排序规则选项安装了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,则可以尝试以下解决方法,这可能会对性能造成一些影响(您应该只为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' 
Will Marcouiller answered 2020-02-22T11:40:37Z
7 votes

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

WHERE可以设置为各种级别。

  1. 服务器级别
  2. 数据库级
  3. 列级
  4. 表达水平

这是MSDN参考。

正如Raj More的回答中所述,可以在每个级别检查WHERE

检查服务器排序规则

SELECT SERVERPROPERTY('COLLATION')

检查数据库整理

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

检查列排序规则

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

检查表达式排序规则

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

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

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

归类说明

为了获得每个WHERE值的描述,请尝试此。

SELECT * FROM fn_helpcollations()

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

enter image description here

您始终可以放置WHERE子句进行过滤,并且仅查看COLLATION的描述。

您可以在此处找到归类列表。

Devraj Gadhavi answered 2020-02-22T11:42:16Z
4 votes

您对整理感兴趣。 您可以根据以下代码片段构建一些东西:

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

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

Joel Coehoorn answered 2020-02-22T11:42:45Z
2 votes

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

类型:SQL_Latin1_General_CP1_CI_AS

这将显示表的结构,在COLLATE列下查看所需字段的详细信息。

然后像这样输入查询:

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

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

DareDevil answered 2020-02-22T11:43:23Z
1 votes

如何检查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信息;)。

shA.t answered 2020-02-22T11:43:52Z
-2 votes

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

Mark Callison answered 2020-02-22T11:44:12Z
translate from https://stackoverflow.com:/questions/1411161/sql-server-check-case-sensitivity