在不同排序规则间复制数据

在 MicrosoftSQL Server 中,数据无需转换即可在 Unicode 列之间顺利移动。但是,若要在包含非 Unicode 字符数据的列之间移动数据,必须将数据从源代码页转换到目标代码页。“代码页”是给定脚本的有序字符集,其中每个字符都与数字索引或码位值关联。代码页支持不同的 Microsoft Windows 区域设置使用的字符集和键盘布局。有关所支持代码页的列表,请参阅代码页体系结构

默认情况下,字符数据将按照下列方式进行转换:

操作

字符数据将转换为:

导出

OEM 代码页字符

导入

ANSI/Microsoft Windows 代码页字符

在 OEM 和 ANSI 代码页之间进行转换会导致扩展字符集字符或双字节字符集 (DBCS) 字符丢失。若要避免 SQL Server 中的此类转换,可以指定一个代码页或一个排序规则。

注意注意

有关将数据库从一种排序规则转换成另一种排序规则的信息,请访问此 Microsoft 网站

在 SQL Server 7.0 及更高版本中,排序规则控制字符串的物理存储。在以下四个级别支持排序规则的设置:服务器实例、数据库、表列和表达式。排序规则指定以下三个属性:

  • 用于存储非 Unicode 字符数据的代码页。

  • 用于 Unicode 数据类型(ncharnvarcharntext)的排序顺序。排序顺序定义字符的排序序列,以及在比较操作中对字符取值的方法。

  • 用于非 Unicode 字符数据类型(char、varchar 和 text)的排序顺序。

注意注意

Microsoft 建议在格式化文件中为每个列指定一个排序规则名称。

有关代码页和排序规则的介绍,请参阅排序规则和 Unicode 支持。有关详细信息,请参阅使用排序规则

使用列级排序规则

在 SQL Server 7.0 和更高版本中,可以指定排序规则在目标数据文件字段(用于大容量导出)或目标表的列(用于大容量导入)中存储数据,以此来控制数据的转换。数据文件排序规则和表列的排序规则之间所需的任何转换都由导入和导出操作在内部执行。

注意注意

SQL Server 7.0 和更高版本支持指定代码页,但最好在格式化文件中指定排序规则。

在大容量导入和大容量导出操作中,排序规则始终应用于 SQLCHAR 列。对于既没有指定 SQLCHAR 也没有指定 SQLNCHAR 作为其宿主数据类型的列,将始终忽略为其指定的列排序规则。在 ORDER 提示中引用 SQLCHAR 和 SQLNCHAR 列的大容量导入操作过程中,排序规则用于确定这些列的排序顺序。

若要指定排序规则,必须使用格式化文件。两种类型的格式化文件均支持指定列级排序规则。有关在非 XML 格式化文件中使用排序规则的信息,请参阅下面的“在非 XML 格式化文件中指定列级排序规则”部分。有关在 XML 格式化文件中使用排序规则的信息,请参阅了解 XML 格式化文件

在非 XML 格式化文件中指定列级排序规则

非 XML 格式化文件中的最后一列(序号位置为 8 的列)包含一个排序规则规范,其中定义了该列的数据以何种方式存储在数据文件中。排序规则列选项如下:

选项

说明

name

指定将数据存储到数据文件时使用的排序规则名称。有关 SQL 排序规则名称的列表,请参阅 SQL Server 排序规则名称 (Transact-SQL)

RAW

指定将数据存储到在命令的代码页选项或 bcp_control BCPFILECP 提示中指定的代码页中。如果二者均未指定,则数据文件的排序规则即为客户端计算机的 OEM 代码页中的排序规则。

注意注意
有关代码页选项的详细信息,请参阅后面本主题中的“使用代码页”。有关详细信息,请参阅 bcp_control 中的 BCPFILECP 提示。

""

与 RAW 含义相同。

示例

以下示例显示的是一个非 XML 格式化文件,其中为字段 2 和 3 指定了列排序规则。排序规则信息以粗体显示。

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""
注意注意

上面的格式化文件用于 AdventureWorks 示例数据库中的 HumanResources.Department 表,该表有 4 列:DepartmentIDNameGroupNameModifiedDate。有关该表的详细信息,请参阅 Department 表 (AdventureWorks)

有关非 XML 格式化文件的详细信息,请参阅了解非 XML 格式化文件

使用代码页

注意注意

若要控制数据的转换,Microsoft 建议您使用格式化文件来指定大容量导出或大容量导入操作的列级排序规则。有关详细信息,请参阅前面的“使用列级排序规则”部分。

指定代码页的语法如下:

  • 若要在 bcp 命令中指定代码页,请使用 -C 开关:

    -C { ACP | OEM | RAW | code_page }

  • 若要使用 BULK INSERT 或 INSERT ...SELECT * FROM OPENROWSET(BULK...) 语句来指定代码页,请使用 CODEPAGE 选项:

    CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

-C 开关和 CODEPAGE 选项均接受以下代码页值:

代码页值

说明

ACP

在导入操作过程中,指定将 charvarchartext 数据类型的数据字段从 ANSI/Windows 代码页 (ISO 1252) 转换为 SQL Server 代码页。

在导出操作过程中,指定 bcp 将这些列从 SQL Server 代码页转换为 ANSI/Windows 代码页。

OEM(默认值)

在导入操作过程中,指定将 charvarchartext 数据类型的数据字段从系统 OEM 代码页转换为 SQL Server 代码页。

在导出操作过程中,指定 bcp 将这些列从 SQL Server 代码页转换为系统 OEM 代码页。

RAW

不发生从一个代码页到另一个代码页的转换。这是执行最快的选项。

code_page

特定的代码页号码,例如 850。有关所支持代码页的列表,请参阅代码页体系结构

示例

下列示例使用了 AdventureWorks 数据库中的 HumanResources.myTeam 表。必须先创建此表,才能运行这些示例。有关该表和如何创建该表的信息,请参阅创建 HumanResources.myTeam 表

注意注意

在对下面的示例进行测试前,应从 myTeam 表中删除现有的行以避免发生主键冲突。

A. 通过 bcp 使用代码页

此示例使用 bcp 将 AdventureWorks 数据库中的 HumanResources.myTeam 表中的数据大容量导出至 myTeam850.txt 数据文件,其中使用了代码页 850。在 Windows 命令提示符下,输入以下内容:

bcp AdventureWorks.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. 通过 BULK INSERT 使用代码页

此示例使用 BULK INSERT 将上面 bcp 示例中创建的 myTeam850.txt 大容量导入到 AdventureWorksHumanResources.myTeam 表中。

在查询工具(如 SQL Server Management Studio 查询编辑器)中执行以下语句:

USE AdventureWorks
GO
DELETE HumanResources.myTeam
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

在不同的排序规则间大容量导出数据

在大容量导出操作中,排序规则规范控制着在数据文件中存储字符数据所使用的代码页。它将应用于:

  • 字符格式数据文件中的所有列。

  • 本机模式文件中所有将 SQLCHAR 指定为宿主文件数据类型的列。

  • 值大于 127 或小于 32 的 SQLCHAR 字符。

    排序规则将应用于值在 32 至 127 之间的字符,但是所有代码页均将相同的字符映射为 32 至 127 之间的值,因此应用不同的排序规则不会产生影响。

确定在大容量导出操作中所使用的排序规则或代码页的规则如下:

  • 如果已在格式化文件中或使用 ODBC bcp_setcolfmt 函数 (bcp_setcolfmt) 指定了列排序规则,则使用与排序规则关联的 ANSI 代码页存储字符数据。

  • 如果未指定列排序规则,但使用命令中的代码页选项或 bcp_control BCPFILECP 提示指定了代码页,则使用指定的代码页存储不具有列排序规则规范的列中的所有 SQLCHAR 数据。

    注意注意

    有关代码页选项的信息,请参阅前面本主题中的“使用代码页”。有关详细信息,请参阅 bcp_control 中的 BCPFILECP 提示。

  • 如果排序规则和代码页均未指定,则使用客户端计算机的 OEM 代码页存储 SQLCHAR 数据。

注意注意

数据文件中不存储关于排序规则/代码页的信息。

在不同的排序规则间大容量导入数据

对于大容量导入操作,代码页解释应用于在数据文件中存储为 SQLCHAR 字符格式数据的列。在字符格式数据文件中,所有列均存储为 SQLCHAR。由于数据文件中未存储有关排序规则/代码页的信息,因而在执行大容量导入操作时,必须提供有关数据字段的排序规则/代码页的信息。

确定在大容量导入操作中所使用的排序规则或代码页的规则如下:

  • 如果已在格式化文件中或使用 ODBC bcp_setcolfmt 函数 (bcp_setcolfmt) 指定了列排序规则,将使用与指定的列排序规则关联的 ANSI 代码页解释数据文件中的 SQLCHAR 数据。请确保您的排序规则规范与数据文件中的排序规则匹配。

  • 如果未指定列排序规则,但在命令中使用代码页选项或在 bcp_control BCPFILECP 提示中指定了代码页,则使用指定的代码页来解释 SQLCHAR 数据。

    注意注意

    有关代码页选项的信息,请参阅前面本主题中的“使用代码页”。有关详细信息,请参阅 bcp_control 中的 BCPFILECP 提示。

  • 如果未指定任何排序规则或代码页,则使用客户端计算机的 OEM 代码页来解释 SQLCHAR 列中的数据。

在大容量导入操作中,排序规则规范控制:

  • 操作如何尝试解释数据文件中的 SQLCHAR 列的代码页。

  • 如果指定了 ORDER 提示,bcp 或 BULK INSERT 将如何应用它。

    如果使用了 ORDER 提示,大容量导入操作将使用排序规则来正确地解释 ORDER 提示。该提示将应用到 SQLCHAR 和 SQLNCHAR 列中。ORDER 提示所引用的列中的数据必须按照映射到这些列的排序规则中定义的序列进行排列。有关详细信息,请参阅控制大容量导入数据时的排序顺序