SQL Server 检查大小写敏感吗?
-
05-07-2019 - |
题
如何检查 SQL Server 中的数据库是否区分大小写?我之前已经运行过查询:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
但我正在寻找其他方法,因为这实际上在过去给我带来了问题。
编辑-更多信息:现有产品有许多预先编写的存储过程。在存储过程中 @test != @TEST
取决于服务器本身的敏感度。所以我正在寻找的是检查服务器敏感性的最佳方法。
解决方案
可以在各个级别设置排序规则:
- 服务器
- 数据库
- 柱子
因此,您可以在不区分大小写的数据库中拥有区分大小写的列。我还没有遇到过可以为单列数据区分大小写的业务案例的情况,但我想可能会有。
检查服务器排序规则
SELECT SERVERPROPERTY('COLLATION')
检查数据库排序规则
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
检查列排序规则
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
其他提示
如果使用默认排序规则选项安装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'
SQL Server 通过以下方式确定区分大小写 COLLATION
.
COLLATION
可以设置为不同级别。
- 服务器级
- 数据库级
- 列级
- 表达水平
人们可以检查 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
.
您可以找到排序规则列表 这里.
您对整理很感兴趣。您可以根据此代码段构建一些内容:
SELECT DATABASEPROPERTYEX('master', 'Collation');
<强>更新强>结果
基于您的编辑<!>#8212;如果@test
和@TEST
可以引用两个不同的变量,那么它不是SQL Server。如果您发现相同的变量不等于自身的问题,请检查该变量是否为NULL
,因为NULL = NULL
返回`false。
使用已创建的表的最佳方法是, 转到Sql Server查询编辑器
输入:sp_help <tablename>
这将显示表的结构,请参阅COLLATE列下所需字段的详细信息。
然后输入查询,如:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
它可能是不同的字符模式<!> lt; SQL_Latin1_General_CP1_CI_AS
<!> gt;,因此最好找出针对该列使用的确切模式。
如何检查SQL Server中的数据库是否区分大小写?
您可以使用以下查询返回您的通知数据库是否区分大小写或者是二进制排序(结果为null):
;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信息;)。
SQL Server不区分大小写。 SELECT * FROM SomeTable
与SeLeCT * frOM soMetaBLe
相同。