如何检查SQL Server中的数据库是否区分大小写?我以前一直在运行查询:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
但我正在寻找其他方法,因为这实际上已经给了我过去的问题。
编辑 - 更多信息:
现有产品有许多预先编写的存储过程。在存储过程@test != @TEST
中,取决于服务器本身的敏感性。所以我正在寻找的是检查服务器灵敏度的最佳方法。
答案 0 :(得分:70)
可以在各个级别设置整理:
因此,您可以在Case Insensitive数据库中拥有区分大小写的列。我还没有遇到过针对单列数据的区分大小写的业务案例的情况,但我想可能存在。
检查服务器整理
SELECT SERVERPROPERTY('COLLATION')
检查数据库整理
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
检查列整理
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
答案 1 :(得分: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'
您可以通过在列级别强制排序来更改查询:
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'
答案 2 :(得分:7)
SQL Server通过COLLATION
确定区分大小写。
COLLATION
可以在不同级别设置。
可以查看Raj More's answer中提到的每个级别的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
的说明。
您可以找到归类列表here。
答案 3 :(得分:4)
您对整理很感兴趣。您可以根据此代码段构建一些内容:
SELECT DATABASEPROPERTYEX('master', 'Collation');
<强>更新强>
根据您的编辑 - 如果@test
和@TEST
可以引用两个不同的变量,那么它不是SQL Server。如果您发现相同变量不等于自身的问题,请检查该变量是否为NULL
,因为NULL = NULL
返回“false”。
答案 4 :(得分:2)
使用已创建的表的最佳方法是, 转到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;,因此最好找出针对该列使用的确切架构。
答案 5 :(得分:1)
如何检查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'));
更多阅读this MSDN information;)。
答案 6 :(得分:-2)
SQL Server不区分大小写。 SELECT * FROM SomeTable
与SeLeCT * frOM soMetaBLe
相同。