MSSQL的排序规则(全面了解)

      一直对Mssql 的排序规则,理解的不完全.  这次认真的学习了下,记录下来,以备参考.

排序规则基础

如果数据库需要国际化或多语言的数据存储,默认SQL Server实例的设置可能就不能满足任务的要求。这个技巧介绍如何使用排序规则查看和操作代码页以及设置排列顺序。SQL Server排序规则决定数据如何排序、比较、表现和存储。

SQL Server允许两种类型的排序规则:Windows或SQL。Windows排序规则是SQL Server的首选,因为它们提供了更多选项并且和微软Windows环境提供的支持一致。SQL排序规则用于早期的SQL Server版本,并且提供了向后兼容性。

除了SQL Server和数据库级别的排序规则设置,各个列也可以有自己的排序规则设置。如果你需要在某个列中保存字符数据,而该列使用的默认排序规则与数据库或服务器级别的排序规则不同,则可以在列定义中使用COLLATE命令。

对于varchar、char、nchar、nvarchar数据类型的列,可以在CREATE TABLE或ALTER TABLE操作中显式定义Windows或者SQL排序规则。

排序规则定义了3个设置:

用于保存非Unicode字符数据类型的代码页;

非Unicode字符数据类型的排列顺序;

Unicode数据类型的排列顺序。

SQL Server实例的默认排序规则在安装时候定义,你可以使用默认的排序规则,也可以显式修改它。接下来的两个技巧会演示如何查看SQL Server实例中的排序规则信息和为表中的列显式定义排序规则。

查看排序规则元数据

可以使用SERVERPROPERTY函数和Collation选项来确定SQL Server实例的默认设置。例如:

1. SELECT SERVERPROPERTY('Collation')

这个查询返回(对于本例的SQL Server实例):

1. SQL_Latin1_General_CP1_CI_AS

除了SQL Server实例的默认排序规则设置,也可以对数据库定义一个默认排序规则。可以使用DATABASEPROPERTYEX系统函数来确定数据库默认的排 序规则。例如,下一个查询确定AdventureWorks数据库默认的数据库排序规则(第一个参数是数据库名,第二个是要查看的Collation选 项): 

1. SELECT DATABASEPROPERTYEX ( 'DataBaseName' , 'Collation' )

这个查询返回下面数据库的排序规则信息(在本例中它和SQL Server实例默认的一样,除非去显式修改它):

1. SQL_Latin1_General_CP1_CI_AS


但是这些排序规则函数的结果是什么意思呢?要确定真正应用到SQL Server实例或者数据库上的排序规则设置,你可以查询fn_helpcollations表函数来获取更友好的信息。在本例中,返回了SQL_ Latin1_General_CP1_CI_AS排序规则的描述:

1. SELECT description
2. FROM sys.fn_helpcollations()
3. WHERE name = 'SQL_Latin1_General_CP1_CI_AS'

这个查询返回排序规则的描述:

1. description
2. Latin1-General, case-insensitive, accent-sensitive,
kanatype
-insensitive, widthinsensitive
3. for Unicode Data, SQL Server Sort Order 52 on
Code Page
1252 for nonUnicode Data

这个结果显示了排序规则代码页的一些细节条目,比如是否区分大小写、排序和Unicode选项等。



指定列的排序规则

    使用ALTER TABLE命令为表的列指定排序规则:

1. ALTER TABLE Production.Product
2. ADD IcelandicProductName nvarchar(50) COLLATE Icelandic_CI_AI,
3. UkrainianProductName nvarchar(50) COLLATE Ukrainian_CI_AS

向Production.Product表中添加了两个新的列。
1. ALTER TABLE Production.Product

然后使用了ADD,后跟新的列名、数据类型、COLLATE关键字和排序规则名(对于排序规则名的列表,可以使用前面说的fn_helpcollations函数来得到):

1. ADD IcelandicProductName nvarchar(50) COLLATE Icelandic_CI_AI,
2. UkrainianProductName nvarchar(50) COLLATE Ukrainian_CI_AS

posted @ 2011-03-02 14:15  不能失败  阅读(4294)  评论(0编辑  收藏  举报