如何检查 SQL Server 中的数据库是否区分大小写?我以前一直在运行查询:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
但我正在寻找其他方法,因为这实际上给我带来了过去的问题。
编辑 - 更多信息:现有产品有许多预先编写的存储过程。在存储过程@test != @TEST
中取决于服务器本身的敏感性。所以我正在寻找的是检查服务器灵敏度的最佳方法。
如何检查 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 排序规则
我的列 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 卡住了,你可以试试这个变通方法,这可能会影响性能(你应该只得到第一个匹配的结果):
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 服务器通过 确定区分大小写COLLATION
。
COLLATION
可以设置在不同的级别。
可以检查Raj More 的回答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');
更新
基于您的编辑——如果@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'
它可能是不同的字符模式 < SQL_Latin1_General_CP1_CI_AS
>,因此最好找出针对该列使用的确切模式。
如何检查 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 信息;)。
SQL Server 不区分大小写。SELECT * FROM SomeTable
是一样的SeLeCT * frOM soMetaBLe
。