设置或更改数据库排序规则

适用于:SQL ServerAzure SQL 托管实例

本文介绍如何使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 设置或更改数据库排序规则。 如果未指定排序规则,则使用服务器排序规则。

限制和局限

  • 仅限 Windows Unicode 的排序规则只能与 COLLATE 子句一起使用,以将排序规则应用于列级别和表达式级别数据上的 nchar、nvarchar 和 ntext 数据类型 。 它们不能与 COLLATE 子句一起使用来更改数据库或服务器实例的排序规则。

  • 如果指定的排序规则或者被引用的对象所使用的排序规则使用 Windows 不支持的代码页,则数据库引擎将显示错误。

  • 可以在创建实例时指定 Azure SQL 托管实例中的服务器级别排序规则,以后不能更改。 有关详细信息,请参阅设置或更改服务器排序规则

重要

不支持对 Azure SQL 数据库执行 ALTER DATABASE COLLATE 语句。 在 创建 CREATE DATABASE 时指定数据库排序规则和目录排序规则。

建议

你可以在 Windows 排序规则名称 (Transact-SQL)SQL Server 排序规则名称 (Transact-SQL) 中找到支持的排序规则名称,或者可以使用 sys.fn_helpcollations (Transact-SQL) 系统函数。

更改数据库排序规则时,会更改下列内容:

  • 将系统表中的任何 charvarchartextncharnvarcharntext 列更改为使用新的排序规则。

  • 存储过程和用户定义函数的所有现有 charvarchartextncharnvarcharntext 参数和标量返回值均已更改为新的排序规则。

  • charvarchartextncharnvarcharntext 系统数据类型和基于这些系统数据类型的所有用户定义的数据类型均已更改为新的默认排序规则。

可以使用 ALTER DATABASE 语句的 COLLATE 子句来更改在用户数据库中创建的任何新对象的排序规则。 使用此语句不能更改任何现有用户定义的表中列的排序规则 。 使用 ALTER TABLECOLLATE 子句可以更改这些列的排序规则。

重要

更改数据库或单个列的排序规则时,不会修改已存储在现有表中的基础数据。 除非你的应用程序显式处理不同排序规则之间的数据转换和比较,否则建议将数据库中的现有数据转换为新的排序规则。 这消除了应用程序可能不当修改数据的风险,错误修改会导致结果可能错误或者数据丢失却无提示。

更改数据库排序规则时,默认情况下,只有新表将继承新的数据库排序规则。 有几种备用方法可将现有数据转换为新的排序规则:

  • 就地转换数据。 若要转换现有表中某列的排序规则,请参阅设置或更改列排序规则。 此操作很容易实现,但可能会造成大型表和繁忙的应用程序受阻的问题。 请查看以下示例,了解将 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';
    
  • 将数据复制到使用新的排序规则的数据库,然后替代原始数据库。 使用新的排序规则创建一个新的数据库,再通过 Integration Services 等工具或者 SQL Server Management Studio 中的“导入/导出向导”传输原始数据库中的数据。 对于复杂架构,此方法更简单。 如果应用程序继续更改数据,那么它还要求在最终截断之前,在原始数据库与新数据库之间进行最终的数据同步。

权限

若要创建新数据库,需要数据库中的权限CREATE DATABASEmaster,或者需要 CREATE ANY DATABASE、 或 ALTER ANY DATABASE 权限。

若要更改现有数据库的排序规则,需要数据库上的 ALTER 权限。

使用 SSMS 设置或更改数据库排序规则

  1. “对象资源管理器” 中,连接到 SQL Server 数据库引擎的实例,再依次展开该实例、 “数据库”

  2. 若要创建新数据库,请右键单击“数据库”,然后选择“新建数据库” 。 如果不希望使用默认排序规则,则选择“选项”页,然后从“排序规则”下拉列表中选择某一排序规则。

    或者,如果数据库已经存在,则右键单击所需数据库,然后选择“属性”。 选择“选项”页,然后从“排序规则”下拉列表中选择某一排序规则 。

  3. 完成后,选择“确定”。

使用 Transact-SQL 设置数据库排序规则

  1. 连接到 数据库引擎。

  2. 在标准栏上,选择“新建查询”。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例演示如何使用 CREATE DATABASE 中的 COLLATE 子句来指定排序规则名称。 此示例创建使用 MyOptionsTest 排序规则的数据库 Latin1_General_100_CS_AS_SC 。 在创建数据库后,执行 SELECT 语句以验证设置。

USE master;  
GO

IF DB_ID (N'MyOptionsTest') IS NOT NULL  
    DROP DATABASE MyOptionsTest;  
GO

CREATE DATABASE MyOptionsTest  
    COLLATE Latin1_General_100_CS_AS_SC;  
GO  
  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'MyOptionsTest';  
GO  

使用 Transact-SQL 更改数据库排序规则

  1. 连接到 数据库引擎。

  2. 在标准栏上,选择“新建查询”。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例说明如何在 ALTER DATABASE 语句中使用 COLLATE 子句来更改排序规则名称。 执行 SELECT 语句以验证更改。

USE master;  
GO

ALTER DATABASE MyOptionsTest  
    COLLATE French_CI_AS ;  
GO  
  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'MyOptionsTest';  
GO  

后续步骤

了解有关排序规则的详细信息: