3 回答
TA贡献1906条经验 获得超10个赞
可以在各种级别上设置排序规则:
服务器
数据库
柱
因此,您可以在不区分大小写的数据库中包含一个区分大小写的列。我还没有遇到过可以针对单个数据列的大小写敏感性进行业务案例研究的情况,但我想可能会这样。
检查服务器排序规则
SELECT SERVERPROPERTY('COLLATION')
检查数据库整理
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
检查列排序规则
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
TA贡献1827条经验 获得超7个赞
如果使用默认排序规则选项安装了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'
TA贡献1799条经验 获得超9个赞
SQL服务器确定由大小写COLLATION。
COLLATION 可以在不同的级别设置。
服务器级
数据库级
列级
表达水平
这里是MSDN参考。
可以COLLATION按Raj More's答案中提到的在每个级别检查。
检查服务器排序规则
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。
您可以在此处找到归类列表。
- 3 回答
- 0 关注
- 772 浏览
添加回答
举报