为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MYYA 2019-11-14 14:10:41
如何检查SQL Server中的数据库是否区分大小写?我以前一直在运行查询:SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END但是我正在寻找其他方式,因为这实际上在过去给了我很多问题。编辑-更多信息:现有产品具有许多预写的存储过程。在存储过程中,@test != @TEST取决于服务器本身的敏感性。因此,我正在寻找的是检查服务器灵敏度的最佳方法。
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

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


服务器

数据库

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


检查服务器排序规则


SELECT SERVERPROPERTY('COLLATION')

检查数据库整理


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

检查列排序规则


select table_name, column_name, collation_name

from INFORMATION_SCHEMA.COLUMNS

where table_name = @table_name


查看完整回答
反对 回复 2019-11-14
?
慕仙森

TA贡献1827条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-11-14
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

SQL服务器确定由大小写COLLATION。


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


服务器级

数据库级

列级

表达水平

这里是MSDN参考。


可以COLLATION按Raj More's答案中提到的在每个级别检查。


检查服务器排序规则


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。


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


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 719 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信