

# 了解 Babelfish 架构和配置
<a name="babelfish-understanding-overview-howitworks"></a>

您管理运行 Babelfish 的 Aurora PostgreSQL 兼容版数据库集群，就像管理任何 Aurora 数据库集群一样。也就是说，您可以从 Aurora 数据库集群提供的可扩展性、具有失效转移支持的高可用性以及内置复制中受益。要了解有关这些功能的更多信息，请参阅[管理 Aurora 数据库集群的性能和扩展](Aurora.Managing.Performance.md)、[Amazon Aurora 的高可用性](Concepts.AuroraHighAvailability.md)和[使用 Amazon Aurora 进行复制](Aurora.Replication.md)。您还可以访问许多其他 AWS 工具和实用程序，包括以下各项：
+ Amazon CloudWatch 是一项监控和可观察性服务，为您提供数据和可操作的洞察。有关更多信息，请参阅 [使用 Amazon CloudWatch 监控 Amazon Aurora 指标](monitoring-cloudwatch.md)。
+ 性能详情是一项数据库性能优化和监控功能，可帮助您快速评估数据库的负载。要了解更多信息，请参阅 [在 Amazon Aurora 上使用性能详情监控数据库负载](USER_PerfInsights.md)。
+ Aurora 全局数据库跨越多个 AWS 区域，可实现低延迟的全局读取，并可从可能影响整个 AWS 区域的罕见停机事件中快速恢复。有关更多信息，请参阅 [使用 Amazon Aurora Global Database](aurora-global-database.md)。
+ 自动软件修补使用可用的最新安全和功能补丁来保持数据库的最新状态。
+ Amazon RDS 事件通过电子邮件或 SMS 消息通知您重要的数据库事件，例如自动失效转移。有关更多信息，请参阅 [监控 Amazon Aurora 事件](working-with-events.md)。

接下来，您可以了解 Babelfish 架构以及 Babelfish 如何处理您迁移的 SQL Server 数据库。创建 Babelfish 数据库集群时，您需要事先就单个数据库或多个数据库、排序规则和其他详细信息做出一些决策。

**Topics**
+ [Babelfish 架构](babelfish-architecture.md)
+ [Babelfish 的数据库集群参数组设置](babelfish-configuration.md)
+ [了解适用于 Aurora PostgreSQL 的 Babelfish 中的排序规则](babelfish-collations.md)
+ [使用转义孵化管理 Babelfish 错误处理](babelfish-strict.md)

# Babelfish 架构
<a name="babelfish-architecture"></a>

当您在打开 Babelfish 的情况下创建 Aurora PostgreSQL 集群时，Aurora 会为该集群预置名为 `babelfish_db` 的 PostgreSQL 数据库。此数据库是所有迁移的 SQL Server 对象和结构所在的位置。

**注意**  
在 Aurora PostgreSQL 集群中，系统会为 Babelfish 预留 `babelfish_db` 数据库名称。在 Babelfish 数据库集群上自行创建“babelfish\$1db”数据库会阻止 Aurora 成功预调配 Babelfish。

当您连接到 TDS 端口时，会话将被放置在 `babelfish_db` 数据库中。从 T-SQL 来看，该结构看起来类似于连接到 SQL Server 实例。您可以看到 `master`、`msdb` 和 `tempdb` 数据库以及 `sys.databases` 目录。您可以创建其他用户数据库并使用 USE 语句在数据库之间切换。当您创建 SQL Server 用户数据库时，该数据库将被展平到 `babelfish_db` PostgreSQL 数据库中。数据库保留的跨数据库语法和语义等于或类似于 SQL Server 提供的语法和语义。

## 将 Babelfish 与单个数据库或多个数据库结合使用
<a name="babelfish-single_vs_multi_db"></a>

当您创建 Aurora PostgreSQL 集群以与 Babelfish 一起使用时，您可以选择单独使用单个 SQL Server 数据库或者将多个 SQL Server 数据库一起使用。您的选择会影响 `babelfish_db` 数据库内的 SQL Server 架构的名称显示在 Aurora PostgreSQL 中的方式。迁移模式存储在 `migration_mode` 参数中。创建集群后不得更改此参数，因为您可能会丢失对所有先前创建的 SQL 对象的访问权限。

在单数据库模式下，SQL Server 数据库的模式名称与 PostgreSQL 的 `babelfish_db` 数据库中保持一致。如果您选择仅迁移单个数据库，则可以在 PostgreSQL 中引用迁移的用户数据库的模式名称，其名称与 SQL Server 中使用的名称相同。例如，`dbo` 和 `smith` 架构驻留在 `dbA` 数据库内*。*

![\[\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/babelfish_single_db_mode.png)


通过 TDS 进行连接时，您可以运行 `USE dba` 以查看来自 T-SQL 的架构 `dbo` 和 `dev`，就像在 SQL Server 中一样。不变的架构名称也可以从 PostgreSQL 中看到。

在多数据库模式下，当从 PostgreSQL 中访问时，用户数据库的模式名称变为 `dbname_schemaname`。从 T-SQL 中访问时，模式名称保持不变。

![\[\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/babelfish_multi_db_mode.png)


如图中所示，当通过 TDS 端口连接并使用 T-SQL 时，多数据库模式和单数据库模式与 SQL Server 相同。例如，`USE dbA` 列出架构 `dbo` 和 `dev`，就像在 SQL Server 中一样。映射的架构名称，例如 `dba_dbo`  和 `dba_dev`，在 PostgreSQL 中可见。

每个数据库仍包含您的架构。每个数据库的名称都加在 SQL Server 架构的名称之前，使用下划线作为分隔符，例如：
+ `dba` 包含 `dba_dbo` 和 `dba_dev`。
+ `dbb` 包含 `dbb_dbo` 和 `dbb_test`。
+ `dbc` 包含 `dbc_dbo` 和 `dbc_prod`。

在 `babelfish_db` 数据库内，T-SQL 用户仍然需要运行 `USE dbname` 以更改数据库上下文，因此外观和感觉与 SQL Server 相似。

## 选择迁移模式
<a name="babelfish-choosing_single_vs_multi"></a>

每种迁移模式都有优点和缺点。根据您拥有的用户数据库数量和迁移计划选择迁移模式。创建用于 Babelfish 的集群后，您不得更改迁移模式，因为您可能无法访问之前创建的所有 SQL 对象。选择迁移模式时，请考虑用户数据库和客户端的要求。

当您创建用于 Babelfish 的集群时，Aurora PostgreSQL 会创建系统数据库 `master` 和 `tempdb`。如果您在系统数据库中创建或修改了对象（`master` 或 `tempdb`)，请确保在新集群中重新创建这些对象。与 SQL Server 不同，Babelfish 不会在集群重启后重新初始化 `tempdb`。

在以下情况下使用单个数据库迁移模式：
+ 如果您要迁移单个 SQL Server 数据库。在单个数据库模式下，当从 PostgreSQL 访问时迁移的模式名称与原始的 SQL Server 模式名称相同。如果您想优化现有 SQL 查询以通过 PostgreSQL 连接运行，则这可以减少对现有 SQL 查询的代码更改。
+ 如果您的最终目标是完全迁移到原生 Aurora PostgreSQL。在迁移之前，将您的架构整合到单个架构中 (`dbo`)，然后迁移到单个集群中以减少所需的更改。

在以下情况下使用多数据库迁移模式：
+ 如果您想在同一个实例中使用多个用户数据库获得原定设置 SQL Server 体验。
+ 如果需要一起迁移多个用户数据库。

# Babelfish 的数据库集群参数组设置
<a name="babelfish-configuration"></a>

当您创建 Aurora PostgreSQL 数据库集群并选择 **Turn on Babelfish**（开启 Babelfish）时，如果您选择 **Create new**（新建），将自动为您创建数据库集群参数组。此数据库集群参数组基于为安装选择的 Aurora PostgreSQL 版本（例如 Aurora PostgreSQL 版本 14）的 Aurora PostgreSQL 数据库集群参数组。它使用以下一般模式命名：

```
custom-aurora-postgresql14-babelfish-compat-3
```

您可以在集群创建过程中更改以下设置，但其中一些设置一旦存储在自定义参数组中，就无法更改，因此请仔细选择：
+ 单个数据库或多个数据库
+ 原定设置排序规则区域设置
+ 排序规则名称
+ 数据库参数组

要使用现有 Aurora PostgreSQL 数据库集群版本 13 或更高版本的参数组，请编辑该组并将 `babelfish_status` 参数设置为 `on`。在创建 Aurora PostgreSQL 集群之前，请指定任何 Babelfish 选项。要了解更多信息，请参阅[Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

以下参数控制 Babelfish 首选项。除非说明中另有规定，否则参数是可修改的。说明中包含原定设置值。要查看任何参数的允许值，请执行以下操作：

**注意**  
将新数据库参数组与数据库实例关联时，修改后的静态和动态参数仅在数据库实例重新启动后得到应用。但是，如果在将数据库参数组与数据库实例关联之后修改数据库参数组中的动态参数，这些更改将立即得到应用，而无需重启。

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 从导航窗格中，选择 **Parameter groups**（参数组）。

1. 从列表中选择 `default.aurora-postgresql14` 数据库集群参数组。

1. 在搜索字段中输入参数的名称。例如，在搜索字段中输入 `babelfishpg_tsql.default_locale`，以显示此参数及其原定设置值和允许的设置。
**注意**  
只有在辅助区域中开启以下参数后，适用于 Aurora PostgreSQL 的 Babelfish 全球数据库才能在这些区域中运行。


| 参数 | 说明 | 应用类型 | 是否可修改 | 
| --- | --- | --- | --- | 
| babelfishpg\$1tsql.apg\$1enable\$1correlated\$1scalar\$1transform | 使计划程序能够在 Babelfish 中转换相关的标量子查询。（默认值：打开）（支持的值：打开、关闭）  | 动态 | true | 
| babelfishpg\$1tsql.apg\$1enable\$1subquery\$1cache | 支持在 Babelfish 中对关联标量子查询使用缓存。（默认值：打开）（支持的值：打开、关闭）  | 动态 | true | 
| babelfishpg\$1tds.tds\$1default\$1numeric\$1scale | 如果引擎未指定一个，则设置要在 TDS 列元数据中发送的数字类型的原定设置扩展。（原定设置值：8）（允许的值：0–38）  | 动态 | true | 
| babelfishpg\$1tds.tds\$1default\$1numeric\$1precision | 一个整数，用于设置要在 TDS 列元数据中发送的数字类型的原定设置精度（如果引擎未指定此精度）。（原定设置值：38）（允许的值：1–38） | 动态 | true | 
| babelfishpg\$1tds.tds\$1default\$1packet\$1size | 一个整数，设置用于连接 SQL Server 客户端的原定设置数据包大小。（原定设置值：4096）（允许的值：512–32767） | 动态 | true | 
| babelfishpg\$1tds.tds\$1default\$1protocol\$1version | 一个整数，设置用于连接客户端的原定设置 TDS 协议版本。（原定设置值：DEFAULT）（允许的值：TDSv7.0、TDSv7.1、TDSv7.1.1、TDSv7.2、TDSv7.3A、TDSv7.3B、TDSv7.4、DEFAULT） | 动态 | true | 
| babelfishpg\$1tds.default\$1server\$1name | 一个字符串，用于标识 Babelfish 服务器的原定设置名称。（原定设置值：Microsoft SQL Server）（允许的值：null） | 动态 | true | 
| babelfishpg\$1tds.tds\$1debug\$1log\$1level | 一个整数，用于在 TDS 中设置日志记录级别；0 表示关闭日志记录。（原定设置值：1）（允许的值：0、1、2、3） | 动态 | true | 
| babelfishpg\$1tds.listen\$1addresses | 一个字符串，用于设置要在其上监听 TDS 的主机名或 IP 地址。创建 Babelfish 数据库集群后将无法修改此参数。（原定设置值：\$1）（允许的值：null）  | – | false | 
| babelfishpg\$1tds.port | 一个整数，指定在 SQL Server 语法中用于请求的 TCP 端口。（原定设置值：1433）（允许的值：1–65535） | 静态 | true | 
| babelfishpg\$1tds.tds\$1ssl\$1crypt | 一个布尔值，用于为遍历 TDS 侦听器端口的数据打开 (0) 或关闭 (1) 加密。有关使用 SSL 进行客户端连接的详细信息，请参阅 [Babelfish SSL 设置和客户端连接](#babelfish-ssl)。（原定设置值：0）（允许的值：0、1） | 动态 | true | 
| babelfishpg\$1tds.tds\$1ssl\$1max\$1protocol\$1version | 一个字符串，指定要用于 TDS 会话的最高 SSL/TLS 协议版本。（原定设置值：“TLSv1.2”）（允许的值：“TLSv1”、“TLSv1.1”、“TLSv1.2”） | 动态 | true | 
| babelfishpg\$1tds.tds\$1ssl\$1min\$1protocol\$1version | 一个字符串，指定要用于 TDS 会话的最低 SSL/TLS 协议版本。（默认值：在 Aurora PostgreSQL 版本 16 中，为“TLSv1.2”；对于比 Aurora PostgreSQL 版本 16 更早的版本，为“TLSv1”）（允许的值：“TLSv1”、“TLSv1.1”、“TLSv1.2”） | 动态 | true | 
| babelfishpg\$1tds.unix\$1socket\$1directories | 一个字符串，用于标识 TDS 服务器 Unix 套接字目录。创建 Babelfish 数据库集群后将无法修改此参数。（原定设置值：/tmp）（允许的值：null） | – | false | 
| babelfishpg\$1tds.unix\$1socket\$1group | 一个字符串，用于标识 TDS 服务器 Unix 套接字组。创建 Babelfish 数据库集群后将无法修改此参数。（原定设置值：rdsdb）（允许的值：null） | – | false | 
| babelfishpg\$1tsql.default\$1locale |  一个字符串，指定用于 Babelfish 排序规则的原定设置区域设置。原定设置区域设置只是区域设置，不包括任何限定符。 在预置 Babelfish 数据库集群时设置此参数。预调配数据库集群后，将忽略对此参数的更改。（原定设置值：en\$1US）（允许的值：请参阅[表](babelfish-collations.md)）   | 静态 | true | 
| babelfishpg\$1tsql.migration\$1mode |  一个不可修改的列表，用于指定对单用户或多用户数据库的支持。在预置 Babelfish 数据库集群时设置此参数。预调配数据库集群后，无法修改此参数的值。（默认值：在 Aurora PostgreSQL 版本 16 中，为 multi-db；对于比 Aurora PostgreSQL 版本 16 更早的版本，为 single-db）（允许的值：single-db、multi-db、null）  | 静态 | true | 
| babelfishpg\$1tsql.server\$1collation\$1name |  一个字符串，指定用于服务器级别操作的排序规则的名称。在预置 Babelfish 数据库集群时设置此参数。预置数据库集群后，请勿修改此参数的值。（原定设置值：bbf\$1unicode\$1general\$1ci\$1as）（允许的值：请参阅[表](babelfish-collations.md)）  | 静态 | true | 
| babelfishpg\$1tsql.version |  一个字符串，用于设置 @@VERSION 变量的输出。请勿为 Aurora PostgreSQL 数据库集群修改此值。（原定设置值：null）（允许的值：原定设置值）  | 动态 | true | 
| rds.babelfish\$1status | 一个字符串，用于设置 Babelfish 功能的状态。如果此参数设置为 `datatypesonly`，Babelfish 将关闭，但 SQL Server 数据类型仍可用。（原定设置值：off）（允许的值：on、off、datatypesonly） | 静态 | true | 
| unix\$1socket\$1permissions | 设置 TDS 服务器 Unix 套接字权限的整数。创建 Babelfish 数据库集群后将无法修改此参数。（原定设置值：0700）（允许的值：0–511） | – | false | 

## Babelfish SSL 设置和客户端连接
<a name="babelfish-ssl"></a>

要想要求使用 SSL/TLS 连接到适用于 Aurora PostgreSQL 的 Babelfish 数据库集群，请使用 `rds.force_ssl` 参数。
+ 要想要求使用 SSL/TLS 连接，请将 `rds.force_ssl` 参数值设置为 1（开启）。
+ 要想不要求使用 SSL/TLS 连接，请将 `rds.force_ssl` 参数值设置为 0（关闭）。

此参数的默认值取决于 Aurora PostgreSQL 版本：
+ 对于 Aurora PostgreSQL 版本 17 及更高版本：默认值为 1（开启）。
+ 对于 Aurora PostgreSQL 版本 16 及较低版本：默认值为 0（关闭）。

**注意**  
当您从 Aurora PostgreSQL 版本 16 或更早版本执行主要版本升级，从而升级到版本 17 或更高版本时，参数的默认值将从 0（关闭）更改为 1（开启）。对于未配置 SSL 的应用程序，此更改可能会导致连接故障。您可以将此参数设置为 0（关闭），从而恢复到之前的默认行为。

有关驱动程序特定的详细信息，请参阅[连接到 Babelfish 数据库集群](babelfish-connect.md)。

当客户端连接到 TDS 端口（原定设置为 `1433`）时，Babelfish 将在客户端握手过程中发送的安全套接字层 (SSL) 设置与 Babelfish SSL 参数设置 (`tds_ssl_encrypt`) 进行比较。然后，Babelfish 确定是否允许连接。如果允许连接，则强制执行加密行为与否具体取决于您的参数设置和客户端提供的加密支持。

下表显示了 Babelfish 对于每个组合的行为。


| 客户端 SSL 设置 | Babelfish SSL 设置 | rds.force\$1ssl | 是否允许连接？ | 返回给客户端的值 | 
| --- | --- | --- | --- | --- | 
| ENCRYPT\$1ON | 任何 | 任何 | 允许，整个连接都已加密 | ENCRYPT\$1ON | 
| ENCRYPT\$1OFF | tds\$1ssl\$1encrypt=1 | 任何 | 允许，整个连接都已加密 | ENCRYPT\$1REQ | 
| ENCRYPT\$1OFF | tds\$1ssl\$1encrypt=0 | rds.force\$1ssl=0 | 允许，登录数据包已加密 | ENCRYPT\$1OFF | 
| ENCRYPT\$1OFF | tds\$1ssl\$1encrypt=0 | rds.force\$1ssl=1 | 否，连接已关闭 | ENCRYPT\$1OFF | 
| ENCRYPT\$1NOT\$1SUP | tds\$1ssl\$1encrypt=0 | rds.force\$1ssl=0 | 是 | ENCRYPT\$1NOT\$1SUP | 
| ENCRYPT\$1NOT\$1SUP | tds\$1ssl\$1encrypt=1 | 任何 | 否，连接已关闭  | ENCRYPT\$1REQ | 
| ENCRYPT\$1NOT\$1SUP | tds\$1ssl\$1encrypt=0 | rds.force\$1ssl=1 | 否，连接已关闭 | ENCRYPT\$1NOT\$1SUP | 
| ENCRYPT\$1CLIENT\$1CERT | 任何 | 任何 | 否，连接已关闭 | 不支持 | 

# 了解适用于 Aurora PostgreSQL 的 Babelfish 中的排序规则
<a name="babelfish-collations"></a>

使用 Babelfish 创建 Aurora PostgreSQL 数据库集群时，请为数据选择排序规则。*排序规则* 指定以给定的书面人类语言生成文本或字符的排序顺序和位模式。排序规则包括用于比较一组给定位模式的数据的规则。排序规则与本地化有关。不同的区域设置会影响字符映射、排序顺序等。排序规则属性反映在各种排序规则的名称中。有关属性的信息，请参阅 [Babelfish collation attributes table](#bfish-collation-attributes-table)。

Babelfish 将 SQL Server 排序规则映射到 Babelfish 提供的类似排序规则。Babelfish 使用文化敏感的字符串比较和排序顺序预先定义了 Unicode 排序规则。Babelfish 还提供了一种将 SQL Server 数据库中的排序规则转换为最接近匹配的 Babelfish 排序规则的方法。针对不同的语言和区域提供了特定于区域设置的排序规则。

某些排序规则指定了与客户端编码对应的代码页。根据每个输出列的排序规则，Babelfish 会自动从服务器编码转换为客户端编码。

Babelfish 支持 [Babelfish supported collations table](#bfish-collations-table)中列出的排序规则。Babelfish 将 SQL Server 排序规则映射到 Babelfish 提供的类似排序规则。

Babelfish 使用 International Components for Unicode 排序规则库的 153.80 版本。有关 ICU 排序规则的更多信息，请参阅 ICU 文档中的[排序规则](https://unicode-org.github.io/icu/userguide/collation/)。要了解有关 PostgreSQL 和排序规则的更多信息，请参阅 PostgreSQL 文档中的[排序规则支持](https://www.postgresql.org/docs/current/collation.html)。

**Topics**
+ [控制排序规则和区域设置的数据库集群参数](#babelfish-collations.parameters)
+ [Babelfish 中的确定性和非确定性排序规则](#babelfish-collations.deterministic-nondeterministic)
+ [Babelfish 支持数据库级别的排序规则](#babelfish-collations.database-level)
+ [Babelfish 中的服务器和对象排序规则](#babelfish-collations.reference-tables-supported-collations)
+ [Babelfish 中的默认排序规则行为](#babelfish-collations-default)
+ [管理排序规则](collation.managing.md)
+ [排序规则限制和行为区别](collation.limitations.md)

## 控制排序规则和区域设置的数据库集群参数
<a name="babelfish-collations.parameters"></a><a name="collation-related-parameters"></a>

以下参数会影响排序规则行为。

**babelfishpg\$1tsql.default\$1locale**  
此参数指定排序规则使用的默认区域设置。此参数与 [Babelfish collation attributes table](#bfish-collation-attributes-table)中列出的属性结合使用，以便为特定语言和区域自定义排序规则。此参数的默认值为 `en-US`。  
默认区域设置适用于以“BBF”开头的所有 Babelfish 排序规则名称，以及映射到 Babelfish 排序规则的所有 SQL Server 排序规则。在现有 Babelfish 数据库集群上更改此参数的设置不会影响现有排序规则的区域设置。有关排序规则的列表，请参阅 [Babelfish supported collations table](#bfish-collations-table)。

**babelfishpg\$1tsql.server\$1collation\$1name**  
此参数指定服务器（Aurora PostgreSQL 数据库集群实例）和数据库的默认排序规则。默认值为 `sql_latin1_general_cp1_ci_as`。`server_collation_name` 必须是一种 `CI_AS` 排序规则，是因为在 T-SQL 中，服务器排序规则决定了标识符的比较方式。  
当您创建 Babelfish 数据库集群时，可以从可供选择的列表中选择 **Collation name**（排序规则名称）。其中包括 [Babelfish supported collations table](#bfish-collations-table)中列出的排序规则。请勿在 Babelfish 数据库创建之后修改 `server_collation_name`。

您在创建 Babelfish for Aurora PostgreSQL 数据库集群时选择的设置存储在与此集群关联且与这些参数对应的数据库集群参数组中，并设置其排序规则行为。

## Babelfish 中的确定性和非确定性排序规则
<a name="babelfish-collations.deterministic-nondeterministic"></a>

Babelfish 支持确定性和非确定性排序规则：
+ *确定性排序规则* 将具有相同字节序列的字符评估为相等。这意味着 `x` 和 `X` 在确定性排序规则中是不相等的。确定性的排序规则可以区分大小写 (CS) 且区分重音 (AS)。
+ *非确定性排序规则* 不需要完全相同的匹配。非确定性排序规则评估 `x` 和 `X` 相等。非确定性排序规则不区分大小写（CI）和/或不区分重音（AI）。

在下表中，您可以找到在使用非确定性排序规则时，Babelfish 和 PostgreSQL 之间的一些行为差异。


| Babelfish | PostgreSQL | 
| --- | --- | 
|  对于 CI\$1AS 排序规则支持 LIKE 子句。  |  对于非确定性排序规则不支持 LIKE 子句。  | 
|  仅在 Babelfish 版本 4.2.0 的以下 AI 排序规则中才支持 LIKE 子句： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/babelfish-collations.html)  |  对于非确定性排序规则不支持 LIKE 子句。  | 

有关 Babelfish 与 SQL Server 和 PostgreSQL 相比的其他限制和行为差异的列表，请参阅[排序规则限制和行为区别](collation.limitations.md)。

Babelfish 和 SQL Server 遵循描述排序规则属性的排序规则命名约定，如下表所示。<a name="bfish-collation-attributes-table"></a>


| 属性 | 描述 | 
| --- | --- | 
| AI | 不区分重音。 | 
| AS | 区分重音。 | 
| BIN2 | BIN2 请求按代码点顺序对数据进行排序。Unicode 代码点顺序与 UTF-8、UTF-16 和 UCS-2 编码的字符顺序相同。代码点顺序是一种快速的确定性排序规则。 | 
| CI | 不区分大小写。 | 
| CS | 区分大小写。 | 
| PREF | 要在小写字母之前对大写字母进行排序，请使用 PREF 排序规则。如果比较不区分大小写，在没有其他区别的情况下，字母的大写版本排序将在小写版本之前。ICU 库支持带有 `colCaseFirst=upper` 的大写字母首选项，但不适用于 CI\$1AS 排序规则。 PREF 只能应用于 `CS_AS` 确定性排序规则。 | 

## Babelfish 支持数据库级别的排序规则
<a name="babelfish-collations.database-level"></a>

Babelfish 支持下列数据库级别的排序规则：
+ bbf\$1unicode\$1bin2
+ bbf\$1unicode\$1cp1\$1ci\$1ai
+ bbf\$1unicode\$1cp1\$1ci\$1as
+ bbf\$1unicode\$1cp1250\$1ci\$1ai
+ bbf\$1unicode\$1cp1250\$1ci\$1as
+ bbf\$1unicode\$1cp1257\$1ci\$1ai
+ bbf\$1unicode\$1cp1257\$1ci\$1as
+ estonian\$1ci\$1ai
+ estonian\$1ci\$1as
+ finnish\$1swedish\$1ci\$1ai
+ finnish\$1swedish\$1ci\$1as
+ french\$1ci\$1ai
+ french\$1ci\$1as
+ latin1\$1general\$1bin2
+ latin1\$1general\$1ci\$1ai
+ latin1\$1general\$1ci\$1as
+ latin1\$1general\$190\$1bin2
+ latin1\$1general\$1100\$1bin2
+ latin1\$1general\$1140\$1bin2
+ modern\$1spanish\$1ci\$1ai
+ modern\$1spanish\$1ci\$1as
+ polish\$1ci\$1ai
+ polish\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1\$1ci\$1ai
+ sql\$1latin1\$1general\$1cp1\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1250\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1251\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1257\$1ci\$1as
+ traditional\$1spanish\$1ci\$1ai
+ traditional\$1spanish\$1ci\$1as

**注意**  
要在数据库级别使用一个不同的排序规则，请确保它与服务器级别排序规则相匹配。有关更多信息，请参阅 [Babelfish 中的服务器和对象排序规则](#babelfish-collations.reference-tables-supported-collations)

## Babelfish 中的服务器和对象排序规则
<a name="babelfish-collations.reference-tables-supported-collations"></a>

将以下排序规则用作服务器排序规则或对象排序规则。<a name="bfish-collations-table"></a>


| 排序规则 ID | 备注 | 
| --- | --- | 
|  bbf\$1unicode\$1general\$1ci\$1as  |  支持不区分大小写的比较和 LIKE 运算符。  | 
|  bbf\$1unicode\$1cp1\$1ci\$1as  |  [非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1252.txt)也被称为 CP1252。  | 
|  bbf\$1unicode\$1CP1250\$1ci\$1as  |  [非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1250.txt)用于表示使用拉丁文字的中欧和东欧语言的文本。  | 
|  bbf\$1unicode\$1CP1251\$1ci\$1as  |  使用西里尔文字的语言的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1251.txt)。  | 
|  bbf\$1unicode\$1cp1253\$1ci\$1as  |  用于代表现代希腊语的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1253.txt)。  | 
|  bbf\$1unicode\$1cp1254\$1ci\$1as  |  支持土耳其语的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1254.txt)。  | 
|  bbf\$1unicode\$1cp1255\$1ci\$1as  |  支持希伯来语的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1255.txt)。  | 
|  bbf\$1unicode\$1cp1256\$1ci\$1as  |  用来编写使用阿拉伯文字的语言的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)。  | 
|  bbf\$1unicode\$1cp1257\$1ci\$1as  |  用于支持爱沙尼亚语、拉脱维亚语和立陶宛语的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1257.txt)。  | 
|  bbf\$1unicode\$1cp1258\$1ci\$1as  |  用于编写越南语字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1258.txt)。  | 
|  bbf\$1unicode\$1cp874\$1ci\$1as  |  用于编写泰语字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit874.txt)。  | 
|  sql\$1latin1\$1general\$1cp1250\$1ci\$1as  |  用来表示拉丁字符的[非确定性单字节字符编码](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1250.txt)。  | 
|  sql\$1latin1\$1general\$1cp1251\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1251.txt)。  | 
|  sql\$1latin1\$1general\$1cp1\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1252.txt)。  | 
|  sql\$1latin1\$1general\$1cp1253\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1253.txt)。  | 
|  sql\$1latin1\$1general\$1cp1254\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1254.txt)。  | 
|  sql\$1latin1\$1general\$1cp1255\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1255.txt)。  | 
|  sql\$1latin1\$1general\$1cp1256\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)。  | 
|  sql\$1latin1\$1general\$1cp1257\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1257.txt)。  | 
|  sql\$1latin1\$1general\$1cp1258\$1ci\$1as  |  支持拉丁字符的[非确定性排序规则](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1258.txt)。  | 
|  chinese\$1prc\$1ci\$1as  |  支持中文 (PRC) 的非确定性排序规则。  | 
|  cyrillic\$1general\$1ci\$1as  |  支持西里尔文的非确定性排序规则。  | 
|  finnish\$1swedish\$1ci\$1as  |  支持芬兰语的非确定性排序规则。  | 
|  french\$1ci\$1as  |  支持法语的非确定性排序规则。  | 
|  japanese\$1ci\$1as  | 支持日语的非确定性排序规则。在 Babelfish 2.1.0 及更高版本中支持。 | 
|  korean\$1wansung\$1ci\$1as  |  支持韩语的非确定性排序规则（带字典排序）。  | 
|  latin1\$1general\$1ci\$1as  |  支持拉丁字符的非确定性排序规则。  | 
|  modern\$1spanish\$1ci\$1as  |  支持现代西班牙语的非确定性排序规则。  | 
|  polish\$1ci\$1as  |  支持波兰语的非确定性排序规则。  | 
|  thai\$1ci\$1as  |  支持泰语的非确定性排序规则。  | 
|  traditional\$1spanish\$1ci\$1as  |  支持西班牙语的非确定性排序规则（传统排序）。  | 
|  turkish\$1ci\$1as  |  支持土耳其语的非确定性排序规则。  | 
|  ukrainian\$1ci\$1as  |  支持乌克兰语的非确定性排序规则。  | 
|  vietnamese\$1ci\$1as  |  支持越南语的非确定性排序规则。  | 

您可以将以下排序规则作为对象排序规则。<a name="bfish-icu-collations-table"></a>


| 方言 | 确定性选项 | 非确定性选项 | 
| --- | --- | --- | 
|  阿拉伯语  |  Arabic\$1CS\$1AS  |  Arabic\$1CI\$1AS Arabic\$1CI\$1AI  | 
|  阿拉伯语文字  |  BBF\$1Unicode\$1CP1256\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1256\$1CS\$1AS  |  BBF\$1Unicode\$1CP1256\$1CI\$1AI BBF\$1Unicode\$1CP1256\$1CS\$1AI  | 
|  二元  |  latin1\$1general\$1bin2 BBF\$1Unicode\$1BIN2  |  –  | 
|  使用拉丁字母的中欧和东欧语言  |  BBF\$1Unicode\$1CP1250\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1250\$1CS\$1AS  |  BBF\$1Unicode\$1CP1250\$1CI\$1AI BBF\$1Unicode\$1CP1250\$1CS\$1AI  | 
|  中文  |  Chinese\$1PRC\$1CS\$1AS  |  Chinese\$1PRC\$1CI\$1AS Chinese\$1PRC\$1CI\$1AI  | 
|  Cyrillic\$1General  |  Cyrillic\$1General\$1CS\$1AS  |  Cyrillic\$1General\$1CI\$1AS Cyrillic\$1General\$1CI\$1AI  | 
|  西里尔文字  |  BBF\$1Unicode\$1CP1251\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1251\$1CS\$1AS  |  BBF\$1Unicode\$1CP1251\$1CI\$1AI BBF\$1Unicode\$1CP1251\$1CS\$1AI  | 
|  爱沙尼亚语  |  Estonian\$1CS\$1AS  |  Estonian\$1CI\$1AS Estonian\$1CI\$1AI  | 
|  爱沙尼亚语、拉脱维亚语和立陶宛语  |  BBF\$1Unicode\$1CP1257\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1257\$1CS\$1AS  |  BBF\$1Unicode\$1CP1257\$1CI\$1AI BBF\$1Unicode\$1CP1257\$1CS\$1AI  | 
|  Finnish\$1Swedish  |  Finnish\$1Swedish\$1CS\$1AS  |  Finnish\$1Swedish\$1CI\$1AS Finnish\$1Swedish\$1CI\$1AI  | 
|  法语  |  French\$1CS\$1AS  |  French\$1CI\$1AS French\$1CI\$1AI  | 
|  希腊语  |  Greek\$1CS\$1AS  |  Greek\$1CI\$1AS Greek\$1CI\$1AI  | 
|  希伯来语  |  BBF\$1Unicode\$1CP1255\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1255\$1CS\$1AS Hebrew\$1CS\$1AS  |  BBF\$1Unicode\$1CP1255\$1CI\$1AI BBF\$1Unicode\$1CP1255\$1CS\$1AI Hebrew\$1CI\$1AS Hebrew\$1CI\$1AI  | 
|  日语（Babelfish 2.1.0 及更高版本）  | Japanese\$1CS\$1AS | Japanese\$1CI\$1AI Japanese\$1CI\$1AS | 
|  Korean\$1Wamsung  |  Korean\$1Wamsung\$1CS\$1AS  |  Korean\$1Wamsung\$1CI\$1AS Korean\$1Wamsung\$1CI\$1AI  | 
|  代码页 CP1252 的拉丁字符  |  latin1\$1general\$1cs\$1as BBF\$1Unicode\$1General\$1CS\$1AS BBF\$1Unicode\$1General\$1Pref\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1\$1CS\$1AS BBF\$1Unicode\$1CP1\$1CS\$1AS  |  latin1\$1general\$1ci\$1as latin1\$1general\$1ci\$1ai latin1\$1general\$1cs\$1ai BBF\$1Unicode\$1General\$1CI\$1AI BBF\$1Unicode\$1General\$1CS\$1AI BBF\$1Unicode\$1CP1\$1CI\$1AI BBF\$1Unicode\$1CP1\$1CS\$1AI  | 
|  现代希腊语  |  BBF\$1Unicode\$1CP1253\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1253\$1CS\$1AS  |  BBF\$1Unicode\$1CP1253\$1CI\$1AI BBF\$1Unicode\$1CP1253\$1CS\$1AI  | 
|  Modern\$1Spanish  |  Modern\$1Spanish\$1CS\$1AS  |  Modern\$1Spanish\$1CI\$1AS Modern\$1Spanish\$1CI\$1AI  | 
|  蒙古语  |  Mongolian\$1CS\$1AS  |  Mongolian\$1CI\$1AS Mongolian\$1CI\$1AI  | 
|  波兰语  |  Polish\$1CS\$1AS  |  Polish\$1CI\$1AS Polish\$1CI\$1AI  | 
|  泰语  |  BBF\$1Unicode\$1CP874\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP874\$1CS\$1AS Thai\$1CS\$1AS  |  BBF\$1Unicode\$1CP874\$1CI\$1AI BBF\$1Unicode\$1CP874\$1CS\$1AI Thai\$1CI\$1AS、Thai\$1CI\$1AI  | 
|  Traditional\$1Spanish  |  Traditional\$1Spanish\$1CS\$1AS  |  Traditional\$1Spanish\$1CI\$1AS Traditional\$1Spanish\$1CI\$1AI  | 
|  土耳其语  |  BBF\$1Unicode\$1CP1254\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1254\$1CS\$1AS Turkish\$1CS\$1AS  |  BBF\$1Unicode\$1CP1254\$1CI\$1AI BBF\$1Unicode\$1CP1254\$1CS\$1AI Turkish\$1CI\$1AS、Turkish\$1CI\$1AI  | 
|  乌克兰语  |  Ukranian\$1CS\$1AS  |  Ukranian\$1CI\$1AS Ukranian\$1CI\$1AI  | 
|  越南语  |  BBF\$1Unicode\$1CP1258\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1258\$1CS\$1AS Vietnamese\$1CS\$1AS  |  BBF\$1Unicode\$1CP1258\$1CI\$1AI BBF\$1Unicode\$1CP1258\$1CS\$1AI Vietnamese\$1CI\$1AS Vietnamese\$1CI\$1AI  | 

## Babelfish 中的默认排序规则行为
<a name="babelfish-collations-default"></a>

以前，可排序的数据类型的默认排序规则是 `pg_catalog.default`。数据类型和依赖于这些数据类型的对象遵循区分大小写的排序规则。这种情况可能会影响使用不区分大小写的排序规则的数据集的 T-SQL 对象。从 Babelfish 2.3.0 开始，可排序的数据类型（TEXT 和 NTEXT 除外）的默认排序规则与 `babelfishpg_tsql.server_collation_name` 参数中的排序规则相同。当您升级到 Babelfish 2.3.0 时，将在创建数据库集群时自动选择默认排序规则，这不会产生任何明显的影响。

# 管理排序规则
<a name="collation.managing"></a>

ICU 库提供排序规则版本跟踪功能，以确保当新版本的 ICU 可用时，依赖排序规则的索引可以重新建立索引。要查看当前数据库是否有需要刷新的排序规则，可以在使用 `psql` 或 `pgAdmin` 进行连接后使用以下查询：

```
SELECT pg_describe_object(refclassid, refobjid,
    refobjsubid) AS "Collation", 
    pg_describe_object(classid, objid, objsubid) AS "Object" 
    FROM pg_depend d JOIN pg_collation c ON refclassid = 'pg_collation'::regclass
    AND refobjid = c.oid WHERE c.collversion <> pg_collation_actual_version(c.oid) 
    ORDER BY 1, 2;
```

此查询返回如下输出：

```
 Collation | Object
-----------+--------
(0 rows)
```

在此示例中，不需要更新排序规则。

要获取 Babelfish 数据库中预定义排序规则的列表，您可以将 `psql` 或 `pgAdmin` 用于以下查询：

```
SELECT * FROM pg_collation;
```

预定义的排序规则存储在 `sys.fn_helpcollations` 表中。您可以使用以下命令显示有关排序规则的信息（例如其 lcid、样式和排序规则标志）。要使用 `sqlcmd` 获取所有排序规则的列表，请连接到 T-SQL 端口（原定设置为 1433），然后运行以下查询：

```
1> :setvar SQLCMDMAXVARTYPEWIDTH 40
2> :setvar SQLCMDMAXFIXEDTYPEWIDTH 40
3> SELECT * FROM fn_helpcollations()
4> GO
name                                     description
---------------------------------------- ----------------------------------------
arabic_cs_as                             Arabic, case-sensitive, accent-sensitive
arabic_ci_ai                             Arabic, case-insensitive, accent-insensi
arabic_ci_as                             Arabic, case-insensitive, accent-sensiti
bbf_unicode_bin2                         Unicode-General, case-sensitive, accent-
bbf_unicode_cp1250_ci_ai                 Default locale, code page 1250, case-ins
bbf_unicode_cp1250_ci_as                 Default locale, code page 1250, case-ins
bbf_unicode_cp1250_cs_ai                 Default locale, code page 1250, case-sen
bbf_unicode_cp1250_cs_as                 Default locale, code page 1250, case-sen
bbf_unicode_pref_cp1250_cs_as            Default locale, code page 1250, case-sen
bbf_unicode_cp1251_ci_ai                 Default locale, code page 1251, case-ins
bbf_unicode_cp1251_ci_as                 Default locale, code page 1251, case-ins
bbf_unicode_cp1254_ci_ai                 Default locale, code page 1254, case-ins
...
(124 rows affected)
```

示例中显示的第 1 行和第 2 行仅出于文档可读性目的而缩小了输出范围。

```
1> SELECT SERVERPROPERTY('COLLATION')
2> GO
serverproperty
---------------------------------------------------------------------------
sql_latin1_general_cp1_ci_as

(1 rows affected)
1>
```

# 排序规则限制和行为区别
<a name="collation.limitations"></a>

Babelfish 使用 ICU 库进行排序规则支持。PostgreSQL 使用特定版本的 ICU 构建，最多可以匹配一个排序规则版本。不同版本之间的差异是不可避免的，随着语言的变化，随着时间的推移，会产生一些细微的变化。在下面的列表中，您可以找到 Babelfish 排序规则的一些已知限制和行为变体：
+ **索引和排序规则类型依赖关系** – 当库版本更改时，依赖于 International Components for Unicode (ICU) 排序规则库（Babelfish 使用的库）的用户定义类型的索引不会失效。
+ **COLLATIONPROPERTY 函数** – 排序规则属性仅针对支持的 Babelfish BBF 排序规则实现。有关更多信息，请参阅 [Babelfish supported collations table](babelfish-collations.md#bfish-collations-table)。
+ **Unicode 排序规则差异** – SQL Server 的 SQL 排序规则对 Unicode 编码的数据（`nchar` 和 `nvarchar`）的排序方式不同于非 Unicode 编码的数据（`char` 和 `varchar`）。Babelfish 数据库始终是 UTF-8 编码的，并且始终一致地应用 Unicode 排序规则，而无论数据类型如何，因此针对 `char` 或 `varchar` 的排序顺序与针对 `nchar` 或 `nvarchar` 的排序顺序相同。
+ **二级相等排序规则和排序行为** – 原定设置的 ICU Unicode 二级相等 (`CI_AS`) 排序规则将标点符号和其他非字母数字字符排序在数字字符之前，将数字字符排序在字母字符之前。但是，标点符号和其他特殊字符的顺序不同。
+ **三级排序规则，ORDER BY 的解决方法** – `SQL_Latin1_General_Pref_CP1_CI_AS` 之类的 SQL 排序规则支持 `TERTIARY_WEIGHTS` 函数并能够对 `CI_AS` 排序规则中进行同等比较的字符串进行排序，大写字母优先排序：`ABC`、`ABc`、`AbC`、`Abc`、`aBC`、`aBc`、`abC`，最后是 `abc`。因此，`DENSE_RANK OVER (ORDER BY column)` 分析函数将这些字符串评估为具有相同的排名，但首先在分区中对它们用大写字母进行排序。

  您可以通过添加一个 `COLLATE` 子句到指定 `@colCaseFirst=upper` 的三级 `CS_AS` 排序规则的 `ORDER BY` 子句中来获取与 Babelfish 相似的结果。但是，`colCaseFirst` 修饰符仅适用于三级相等的字符串（而不是 `CI_AS` 排序规则之类的二级相等字符串）。因此，您无法使用单个 ICU 排序规则模拟三级 SQL 排序规则。

  作为解决办法，我们建议您修改使用 `SQL_Latin1_General_Pref_CP1_CI_AS` 排序规则的应用程序，以首先使用 `BBF_SQL_Latin1_General_CP1_CI_AS` 排序规则。然后将 `COLLATE BBF_SQL_Latin1_General_Pref_CP1_CS_AS` 添加到此列的任何 `ORDER BY` 子句中。
+ **字符扩展** – 字符扩展将单个字符视为等于主级别的一系列字符。SQL Server 的原定设置 `CI_AS` 排序规则支持字符扩展。ICU 排序规则仅支持对不区分重音的排序规则进行字符扩展。

  当需要扩展字符时，请使用 `AI` 排序规则进行比较。但是，LIKE 运算符目前不支持此类排序规则。
+ **char 和 varchar 编码** – 当将 SQL 排序规则用于 `char` 或 `varchar` 数据类型时，ASCII 127 之前的字符的排序顺序由该 SQL 排序规则的特定代码页决定。对于 SQL 排序规则，声明为 `char` 或 `varchar` 的字符串可能与声明为 `nchar` 或 `nvarchar` 的字符串的排序方式不同。

  PostgreSQL 使用数据库编码对所有字符串进行编码，因此，所有字符转换为 UTF-8 并使用 Unicode 规则进行排序。

  由于 SQL 排序规则使用 Unicode 规则对 nchar 和 nvarchar 数据类型进行排序，因此，Babelfish 会使用 UTF-8 对服务器上的所有字符串进行编码。Babelfish 使用 Unicode 规则对 nchar 和 nvarchar 字符串进行排序的方式与对 char 和 varchar 字符串进行排序的方式相同。
+ **补充字符** – SQL Server 函数 `NCHAR`、`UNICODE` 和 `LEN` 支持 Unicode 基本多语言平面 (BMP) 之外的代码点的字符。相比之下，非 SC 排序规则使用代理对字符来处理补充字符。对于 Unicode 数据类型，SQL Server 可以使用 UCS-2 最多表示 65535 个字符，如果使用补充字符，则表示完整的 Unicode 范围（1114114 个字符）。
+ **区分假名 (KS) 排序规则** – 区分假名 (KS) 排序规则是以不同方式处理 `Hiragana` 和 `Katakana` 日语假名字符的排序规则。ICU 支持日语排序规则标准 `JIS X 4061`。现在已弃用的 `colhiraganaQ [on | off]` 区域设置修饰符可能会提供与 KS 排序规则相同的功能。但是，Babelfish 目前不支持与 SQL Server 同名的 KS 排序规则。
+ **区分全角和半角 (WS) 排序规则** – 如果单字节字符（半角）和表示为双字节字符（全角）的同一个字符被区别对待，则排序规则被称为*区分全角和半角 (WS)*。Babelfish 目前不支持与 SQL Server 同名的 WS 排序规则。
+ **变体选择器敏感性 (VSS) 排序规则** – 变体选择器敏感性 (VSS) 排序规则区分日语排序规则 `Japanese_Bushu_Kakusu_140` 和 `Japanese_XJIS_140` 中的表意文字变体选择器。变体序列由基本字符加上一个额外的变体选择器组成。如果您不选择 `_VSS` 选项，则在比较中不考虑变体选择器。

  Babelfish 目前不支持 VSS 排序规则。
+ **BIN 和 BIN2 排序规则** – BIN2 排序规则根据代码点顺序对字符进行排序。UTF-8 的逐字节二进制顺序保留了 Unicode 代码点顺序，因此这也可能是性能最佳的排序规则。如果 Unicode 代码点顺序适用于应用程序，请考虑使用 BIN2 排序规则。但是，使用 BIN2 排序规则可能会导致数据以一种文化上意想不到的顺序在客户端上显示。随着时间的推移，小写字符的新映射将添加到 Unicode 中，因此 `LOWER` 函数在不同版本的 ICU 上可能会有所不同。这是比较一般的排序规则版本控制问题的特殊情况，而不是 BIN2 排序规定的特定情况。

  Babelfish 以 Babelfish 发行版提供 `BBF_Latin1_General_BIN2` 排序规则，以便按 Unicode 代码点顺序进行排序。在 BIN 排序规则中，只有第一个字符被排序为 wchar。剩余字符按字节排序，以有效地根据其编码按代码点顺序排序。这种方法不遵循 Unicode 排序规则，也不受 Babelfish 支持。
+ **非确定性排序规则和 CHARINDEX 限制** – 对于早于版本 2.1.0 的 Babelfish 版本，您不能将 CHARINDEX 与非确定性排序规则结合使用。原定设置情况下，Babelfish 使用不区分大小写（不确定性）排序规则。对较旧版本的 Babelfish 使用 CHARINDEX 会引发以下运行时错误：

  ```
  nondeterministic collations are not supported for substring searches
  ```
**注意**  
此限制和解决方法仅适用于 Babelfish 版本 1.x（Aurora PostgreSQL 13.x 版本）。Babelfish 2.1.0 及更高版本没有此问题。

  您可以通过以下方式之一解决此问题：
  + 将表达式显式转换为区分大小写的排序规则，然后通过应用 LOWER 或 UPER 将两个参数转换为大写。例如，`SELECT charindex('x', a) FROM t1` 将变为以下内容：

    ```
    SELECT charindex(LOWER('x'), LOWER(a COLLATE sql_latin1_general_cp1_cs_as)) FROM t1
    ```
  + 创建一个 SQL 函数 f\$1charindex，然后将 CHARINDEX 调用替换为对以下函数的调用：

    ```
    CREATE function f_charindex(@s1 varchar(max), @s2 varchar(max)) RETURNS int
    AS
    BEGIN
    declare @i int = 1
    WHILE len(@s2) >= len(@s1)
    BEGIN
      if LOWER(@s1) = LOWER(substring(@s2,1,len(@s1))) return @i
      set @i += 1
      set @s2 = substring(@s2,2,999999999)
    END
    return 0
    END
    go
    ```

# 使用转义孵化管理 Babelfish 错误处理
<a name="babelfish-strict"></a>

在可能的情况下，Babelfish 会针对控制流和事务状态模仿 SQL 行为。当 Babelfish 遇到错误时，它会返回与 SQL Server 错误代码类似的错误代码。如果 Babelfish 无法将错误映射到 SQL Server 代码，它会返回一个固定的错误代码 (`33557097`)，并根据错误类型采取具体操作，如下所示：
+ 对于编译时错误，Babelfish 会回滚事务。
+ 对于运行时错误，Babelfish 会结束批处理并回滚事务。
+ 对于客户端和服务器之间的协议错误，不会回滚该事务。

如果错误代码无法映射到等效代码并且类似错误的代码可用，则错误代码将映射到替代代码。例如，导致 SQL Server 代码 `8143` 和 `8144` 的行为都会映射到 `8143`。

无法映射的错误不尊重 `TRY... CATCH` 构造。

您可以使用 `@@ERROR` 返回 SQL Server 错误代码，或使用 `@@PGERROR` 函数返回 PostgreSQL 错误代码。您也可以使用 `fn_mapped_system_error_list` 函数返回映射的错误代码列表。有关 PostgreSQL 错误代码的信息，请参阅 [PostgreSQL 网站](https://www.postgresql.org/docs/current/errcodes-appendix.html)。

## 修改 Babelfish 转义孵化设置
<a name="babelfish-escape_hatches"></a>

为了处理可能失败的语句，Babelfish 定义了一些称为转义孵化的选项。*转义孵化*是一个选项，用于在遇到不受支持的功能或语法时的指定 Babelfish 行为。

您可以使用 `sp_babelfish_configure` 存储过程来控制转义孵化的设置。使用脚本将转义孵化设置为 `ignore` 或 `strict`。如果设置为 `strict`，Babelfish 会返回一个错误，您需要纠正该错误后才能继续。

要将更改应用于当前会话和集群级别，请包含 `server` 关键字。

使用情况如下所示：
+ 要列出所有转义孵化及其状态，以及使用信息，请运行 `sp_babelfish_configure`。
+ 要列出命名的转义孵化及其值，对于当前会话或集群范围，请运行命令 `sp_babelfish_configure 'hatch_name'`，其中 `hatch_name` 是一个或多个转义孵化的标识符。*hatch\$1name* 可以使用 SQL 通配符，例如“%”。
+ 要将一个或多个转义孵化设置为指定的值，请运行 `sp_babelfish_configure ['hatch_name' [, 'strict'|'ignore' [, 'server']]`。要在集群级别上使设置永久化，请包括 `server` 关键字，如下面所示：

  ```
  EXECUTE sp_babelfish_configure 'escape_hatch_unique_constraint', 'ignore', 'server'
  ```

  要仅为当前会话设置它们，请不要使用 `server`。
+ 要将所有转义孵化重置为默认值，请运行 `sp_babelfish_configure 'default'`（Babelfish 1.2.0 及更高版本）。

标识孵化（或多个孵化）的字符串可能包含 SQL 通配符。例如，以下选项为 Aurora PostgreSQL 集群将所有语法转义孵化设置为 `ignore`。

```
EXECUTE sp_babelfish_configure '%', 'ignore', 'server'
```

在下表中，您可以找到 Babelfish 预定义的转义孵化的描述和默认值。


| 转义孵化 | 描述 | 默认 | 
| --- | --- | --- | 
| escape\$1hatch\$1checkpoint |  允许在过程代码中使用 CHECKPOINT 语句，但当前尚未实现 CHECKPOINT 语句。  |  忽略  | 
| escape\$1hatch\$1constraint\$1name\$1for\$1default |  控制与默认约束名称相关的 Babelfish 行为。  |  忽略  | 
| escape\$1hatch\$1database\$1misc\$1options |  控制与 CREATE DATABASE 上的以下选项相关的 Babelfish 行为：CONTAINMENT、DB\$1CHAINING、TRUSTWORTHY、PERSISTENT\$1LOG\$1BUFFER。  |  忽略  | 
| escape\$1hatch\$1for\$1replication |  控制创建或更改表时与 [NOT] FOR REPLICATION 子句相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1fulltext |  控制与 FULLTEXT 功能相关的 Babelfish 行为，例如 CREATE/ALTER DATABASE、CREATE FULLTEXT INDEX 中的 DEFAULT\$1FULLTEXT\$1LANGUAGE 或 sp\$1fulltext\$1database。  |  忽略  | 
| escape\$1hatch\$1ignore\$1dup\$1key |  控制与 CREATE/ALTER TABLE 和 CREATE INDEX 相关的 Babelfish 行为。当 IGNORE\$1DUP\$1KEY=ON 时，设置为 `strict`（默认值）时会引发错误，设置为 `ignore` 时会忽略错误（Babelfish 版本 1.2.0 及更高版本）。  |  严格  | 
| escape\$1hatch\$1index\$1clustering |  控制与索引的 CLUSTERED 或 NONCLUSTERED 关键字相关的 Babelfish 行为以及 PRIMARY KEY 或 UNIQUE 约束。如果忽略 CLUSTERED，则仍会像指定了 NONCLUSTERED 一样创建索引或约束条件。  |  忽略  | 
| escape\$1hatch\$1index\$1columnstore |  控制与 COLUMNSTORE 子句相关的 Babelfish 行为。如果您指定 `ignore`，Babelfish 会创建一个常规的 B 树索引。  |  严格  | 
| escape\$1hatch\$1join\$1hints |  控制 JOIN 运算符中关键字的行为：LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。  |  忽略  | 
| escape\$1hatch\$1language\$1non\$1english |  控制屏幕上的消息中与英语以外的语言相关的 Babelfish 行为。Babelfish 目前仅对屏幕上的消息支持 `us_english`。SET LANGUAGE 可能会使用包含语言名称的变量，因此只能在运行时检测到正在设置的实际语言。  |  严格  | 
| escape\$1hatch\$1login\$1hashed\$1password |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1misc\$1options |  如果被忽略，则除了 `HASHED`、`MUST_CHANGE`、`OLD_PASSWORD` 之外，还会抑制其他关键字的错误，并且还会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK`。  |  严格  | 
| escape\$1hatch\$1login\$1old\$1password |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `OLD_PASSWORD` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1password\$1must\$1change |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `MUST_CHANGE` 关键字。  |  严格  | 
| escape\$1hatch\$1login\$1password\$1unlock |  如果被忽略，则会抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK` 关键字。  |  严格  | 
| escape\$1hatch\$1nocheck\$1add\$1constraint |  控制与 WITH CHECK 或 NOCHECK 子句相关的 Babelfish 行为以获取约束条件。  |  严格  | 
| escape\$1hatch\$1nocheck\$1existing\$1constraint |  控制与 FOREIGN KEY 或 CHECK 约束相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1query\$1hints |  控制与查询提示相关的 Babelfish 行为。当此选项设置为忽略时，服务器将忽略使用 OPTION (...) 子句指定查询处理方面的提示。示例包括 SELECT FROM ... OPTION(MERGE JOIN HASH, MAXRECURSION 10))。  |  忽略  | 
|  escape\$1hatch\$1rowversion | 控制 ROWVERSION 和 TIMESTAMP 数据类型的行为。有关使用信息，请参阅[使用具有有限实施的 Babelfish 功能](babelfish-compatibility.tsql.limited-implementation.md)。 | 严格 | 
| escape\$1hatch\$1schemabinding\$1function |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER FUNCTION 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1schemabinding\$1procedure |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER PROCEDURE 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1rowguidcol\$1column |  控制创建或更改表时与 ROWGUIDCOL 子句相关的 Babelfish 行为。  |  严格  | 
| escape\$1hatch\$1schemabinding\$1trigger |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER TRIGGER 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1schemabinding\$1view |  控制与 WITH SCHEMABINDING 子句相关的 Babelfish 行为。预设情况下，使用 CREATE 或 ALTER VIEW 命令指定时，WITH SCHEMABINDING 子句将被忽略。  |  忽略  | 
| escape\$1hatch\$1session\$1settings |  控制 Babelfish 针对不受支持的会话级别 SET 语句的行为。  |  忽略  | 
| escape\$1hatch\$1showplan\$1all |  控制与 SET SHOWPLAN\$1ALL 和 SET STATISTICS PROFILE 相关的 Babelfish 行为。当设置为 ignore 时，它们的行为与 SET BABELFISH\$1SHOWPLAN\$1ALL 和 SET BABELFISH\$1STATISTICS PROFILE 类似；设置为 strict 时，它们将被无提示忽略。  |  严格  | 
| escape\$1hatch\$1storage\$1on\$1partition |  在定义分区时控制与 `ON partition_scheme column ` 子句相关的 Babelfish 行为。Babelfish 目前没有实施分区。  |  严格  | 
| escape\$1hatch\$1storage\$1options |  对 CREATE、ALTER DATABASE、TABLE、INDEX 中使用的任何存储选项的转义孵化。这包括为表、索引和约束以及为数据库定义存储位置（分区、文件组）的子句 (LOG) ON、TEXTIMAGE\$1ON、FILESTREAM\$1ON。此转义孵化设置适用于所有这些子句（包括 ON [PRIMARY] 和 ON“DEFAULT”）。例外情况是，使用 ON partition\$1scheme（列）为表或索引指定分区时。  |  忽略  | 
| escape\$1hatch\$1table\$1hints |  控制使用 WITH (...) 子句指定的表提示的行为。  |  忽略  | 
| escape\$1hatch\$1unique\$1constraint |  当设置为 strict 时，SQL Server 和 PostgreSQL 在处理索引列上的 NULL 值方面的模糊语义差异可能会引发错误。只有在不切实际的使用案例中才会出现语义差异，因此您可以将此转义孵化设置为“ignore”以避免看到错误。 在以下版本中已弃用：3.6.0 及更高版本、4.2.0 及更高版本  |  严格  | 