本文介绍如何使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 设置或更改数据库排序规则。
如果未指定数据库排序规则,则使用服务器排序规则。
建议
你可以在 Windows 排序规则名称和 SQL Server 排序规则名称中找到支持的排序规则名称,或者可以使用 sys.fn_helpcollations 系统函数。
更改数据库排序规则时,会更改下列内容:
- 将系统表中的任何 char、 varchar、 text、 nchar、 nvarchar或 ntext 列更改为使用新的排序规则。 
- 存储过程和用户定义函数的所有现有 char、 varchar、 text、 nchar、 nvarchar或 ntext 参数和标量返回值均已更改为新的排序规则。 
- char、 varchar、 text、 nchar、 nvarchar或 ntext 系统数据类型和基于这些系统数据类型的所有用户定义的数据类型均已更改为新的默认排序规则。 
可以使用 ALTER DATABASE 语句的 COLLATE 子句来更改在用户数据库中创建的任何新对象的排序规则。 使用此语句不能更改任何现有用户定义的表中列的排序规则。 使用 ALTER TABLE 的 COLLATE 子句可以更改这些列的排序规则。
权限
若要创建新数据库,需要 master 数据库中的 CREATE DATABASE 权限,或者需要 CREATE ANY DATABASE 或 ALTER ANY DATABASE 权限。
若要更改现有数据库的排序规则,需要数据库上的 ALTER 权限。
设置或更改数据库排序规则
本文介绍如何使用 SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL) 设置或更改数据库排序规则。
可以为新数据库指定排序规则,也可以使用 SQL Server Management Studio (SSMS) 更新现有数据库的排序规则。
在 SQL Server Management Studio 中,打开“对象资源管理器”,连接到 SQL Server 数据库引擎的实例,再依次展开该实例和“数据库”:
- 对于新数据库:右键单击“数据库”,然后选择“新建数据库”。 如果不希望使用默认排序规则,则选择“选项”页,然后从“排序规则”下拉列表中选择某一排序规则。
- 对于现有数据库:右键单击所需的数据库并选择“属性”。 选择“选项”页,然后从“排序规则”下拉列表中选择某一排序规则。
更改排序规则后的数据
重要
更改数据库或单个列的排序规则时,不会修改已存储在现有表中的基础数据。 除非你的应用程序显式处理不同排序规则之间的数据转换和比较,否则建议将数据库中的现有数据转换为新的排序规则。 这消除了应用程序可能不当修改数据的风险,错误修改会导致结果可能错误或者数据丢失却无提示。
更改数据库排序规则时,默认情况下,只有新表将继承新的数据库排序规则。 有几种备用方法可将现有数据转换为新的排序规则:
- 就地转换数据。 若要转换现有表中某列的排序规则,请参阅设置或更改列排序规则。 此操作很容易实现,但可能会造成大型表和繁忙的应用程序受到阻碍。 请查看以下示例,了解将 - MyString列就地转换为新的排序规则的情况:- ALTER TABLE dbo.MyTable ALTER COLUMN MyString VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8;
- 将数据复制到使用新的排序规则的新表中,并替换同一数据库中的原始表。 在当前数据库中创建一个将继承数据库排序规则的新表,在旧表与新表之间复制数据,删除原始表,然后将新表重命名为原始表的名称。 该操作比就地转换的速度要快,但在处理具有依赖项(例如外键约束、主键约束和触发器)的复杂架构时,可能成为一项挑战。 如果应用程序继续更改数据,那么它还要求在最终截断之前,在原始表与新表之间进行最终的数据同步。 请查看以下示例,了解通过“复制替换”方式将 - MyString列转换为新的排序规则的情况:- CREATE TABLE dbo.MyTable2 (MyString VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8); INSERT INTO dbo.MyTable2 SELECT * FROM dbo.MyTable; DROP TABLE dbo.MyTable; EXEC sp_rename 'dbo.MyTable2', 'dbo.MyTable';
- 将数据复制到使用新的排序规则的数据库,然后替代原始数据库。 使用新的排序规则创建一个新的数据库,再通过集成服务等工具或者 SQL Server Management Studio 中的“导入/导出向导”传输原始数据库中的数据。 对于复杂架构,此方法更简单。 如果应用程序继续更改数据,那么它还要求在最终截断之前,在原始数据库与新数据库之间进行最终的数据同步。 
限制
- 仅限 Windows Unicode 的排序规则只能与 COLLATE 子句一起使用,以将排序规则应用于列级别和表达式级别数据上的 nchar、nvarchar 和 ntext 数据类型。 它们不能与 COLLATE 子句一起使用来更改数据库或服务器实例的排序规则。 
- 如果指定的排序规则或者被引用的对象所使用的排序规则使用 Windows 不支持的代码页,则数据库引擎将显示错误。 
- 可以在创建实例时指定 Azure SQL 托管实例中的服务器级别排序规则,以后不能更改。 有关详细信息,请参阅设置或更改服务器排序规则。 
重要
不支持对 Azure SQL 数据库执行 ALTER DATABASE COLLATE 语句。 在 CREATE DATABASE 时指定数据库排序规则和目录排序规则。