SQL Server检查大小写敏感吗?
如何检查SQL Server中的数据库是否区分大小写? 我以前一直在运行查询:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
但是我正在寻找其他方法,因为这实际上给了我过去的问题。
编辑 – 多一点信息:现有的产品有许多预先写好的存储过程。 在存储过程@test != @TEST
这取决于服务器本身的敏感性。 所以我正在寻找的是检查服务器的灵敏度最好的方法。
整理可以设置在不同的级别:
- 服务器
- 数据库
- 柱
所以你可以在不区分大小写的数据库中有一个区分大小写的列。 我还没有遇到一个情况,一个商业案例可以作出区分大小写的单列数据,但我想可能会有。
检查服务器sorting
SELECT SERVERPROPERTY('COLLATION')
检查数据库整理
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
检查列整理
select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name
如果您使用默认sorting选项安装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'
您可以通过在列级强制sorting来更改查询:
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查询,因此我会先隔离此testing。 在SQL Server 2000中,您可以轻松运行ALTER TABLE语句来更改特定列的sorting顺序,从而强制区分大小写。 首先,执行以下查询来确定您需要将其更改回:
EXEC sp_help 'mytable'
第二个logging集应包含以下信息,在默认情况下:
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标识符replace为你之前find的):
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
可以设置在不同的级别。
- 服务器级
- 数据库级
- 列级
- expression水平
这是MSDN的参考。
如Raj More的回答中所提到的,每个级别都可以检查COLLATION
。
检查服务器sorting
SELECT SERVERPROPERTY('COLLATION')
检查数据库整理
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
检查列整理
select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name
检查expression式sorting
对于expression级别COLLATION
您需要查看expression式。 🙂
一般在expression式的末尾,如下面的例子。
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
整理说明
为了获得每个COLLATION
值的描述,请试试这个。
SELECT * FROM fn_helpcollations()
你应该看到这样的东西。
您始终可以使用WHERE
子句进行筛选,仅查看COLLATION
。
你可以在这里findsorting列表。
您对sorting规则感兴趣。 你可以build立一些基于这个片段的东西:
SELECT DATABASEPROPERTYEX('master', 'Collation');
更新
基于你的编辑 – 如果@test
和@TEST
可以引用两个不同的variables,那不是SQL Server。 如果你看到同一个variables不等于自己的问题,检查该variables是否为NULL
,因为NULL = NULL
返回false。
处理已经创build的表的最好方法是,转到Sql Server查询编辑器
types: 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中的数据库是否区分大小写?
您可以使用下面的查询返回您的通知数据库是否区分大小写或在二进制sorting(与空结果):
;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
相同。