SQL Server检查区分大小写?

Kyl*_*yle 48 sql t-sql sql-server case-sensitive

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

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
Run Code Online (Sandbox Code Playgroud)

但我正在寻找其他方式,因为这实际上给了我过去的问题.

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

Raj*_*ore 71

整理可以设置在不同的级别:

  1. 服务器
  2. 数据库

因此,您可以在Case Insensitive数据库中拥有区分大小写的列.我还没有遇到这样一种情况,即可以针对单列数据的区分大小写做出商业案例,但我想可能存在.

检查服务器排序规则

SELECT SERVERPROPERTY('COLLATION')
Run Code Online (Sandbox Code Playgroud)

检查数据库排序规则

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Run Code Online (Sandbox Code Playgroud)

检查列整理

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见,您也可以使用`SELECT*FROM foo在SQL中设置排序规则,其中x ='y'COLLATE sql_latin1_general_cp1_cs_as` (27认同)
  • 只需在拼图中添加一个部分:如果归类名称包含_CI_,则它不区分大小写,如果它包含_CS_则区分大小写.[在MSDN中阅读更多内容](https://msdn.microsoft.com/en-us/library/ms180175.aspx) (7认同)
  • @Gordon我希望你不要在你的数据库中以明文形式存储密码! (4认同)

Wil*_*ler 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' 
Run Code Online (Sandbox Code Playgroud)

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

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') 
Run Code Online (Sandbox Code Playgroud)

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

EXEC sp_help 'mytable' 
Run Code Online (Sandbox Code Playgroud)

在默认方案中,第二个记录集应包含以下信息:

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' 
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用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' 
Run Code Online (Sandbox Code Playgroud)


Dev*_*avi 7

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

COLLATION 可以设置在各个级别.

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

这是MSDN参考.

COLLATIONRaj More的回答所述,可以检查每个级别.

检查服务器排序规则

SELECT SERVERPROPERTY('COLLATION')
Run Code Online (Sandbox Code Playgroud)

检查数据库排序规则

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Run Code Online (Sandbox Code Playgroud)

检查列整理

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Run Code Online (Sandbox Code Playgroud)

检查表达式排序规则

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

它通常在表达式的末尾,如下例所示.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
Run Code Online (Sandbox Code Playgroud)

整理说明

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

SELECT * FROM fn_helpcollations()
Run Code Online (Sandbox Code Playgroud)

你应该看到这样的事情.

在此输入图像描述

您始终可以放置一个WHERE子句来过滤并仅查看您的说明COLLATION.

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