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
整理可以设置在不同的级别:
因此,您可以在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)
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)
SQL Server通过确定区分大小写COLLATION
.
COLLATION
可以设置在各个级别.
COLLATION
如Raj 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
.
您可以在此处找到排序规则列表.