

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解 Babelfish 架構和組態
<a name="babelfish-understanding-overview-howitworks"></a>

您可以如同管理任何 Aurora 資料庫叢集一樣地管理執行 Babelfish 的 Aurora PostgreSQL 相容版本資料庫叢集。也就是說，您可享有 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 全球資料庫](aurora-global-database.md)。
+ 自動軟體修補使用最新發佈的安全性和功能修補程式，隨時更新資料庫。
+ Amazon RDS 事件透過電子郵件或簡訊，通知您重要的資料庫事件，例如自動容錯移轉。如需更多詳細資訊，請參閱 [監控 Amazon Aurora 事件](working-with-events.md)。

在下文中，您可以了解 Babelfish 架構，以及 Babelfish 如何處理您遷移的 SQL Server 資料庫。建立 Babelfish 資料庫叢集時，您需要預先針對單資料庫或多資料庫、定序和其他詳細資料做出一些決策。

**Topics**
+ [Babelfish 架構](babelfish-architecture.md)
+ [Babelfish 的資料庫叢集參數群組設定](babelfish-configuration.md)
+ [了解 Babelfish for Aurora PostgreSQL 中的定序](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>

建立適用於 Babelfish 的 Aurora PostgreSQL 叢集時，您可以選擇單獨使用一個 SQL Server 資料庫，或同時使用多個 SQL Server 資料庫。您的選擇會影響 `babelfish_db` 資料庫內的 SQL Server 結構描述名稱如何出現在 Aurora PostgreSQL 中。遷移模式存放在 `migration_mode` 參數中。您不得在建立叢集之後變更此參數，因為您可能會失去先前建立之所有 SQL 物件的存取權。

在單一資料庫模式中，SQL Server 資料庫的結構描述名稱在 PostgreSQL 的 `babelfish_db` 資料庫中仍保持相同。如果您選擇只遷移單一資料庫，則可以利用 SQL Server 中使用的同一名稱，在 PostgreSQL 中參考已遷移之使用者資料庫的結構描述名稱。例如，`dbo` 和 `smith` 結構描述位於 `dbA` 資料庫內*。*

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


透過 TDS 連線時，您可以執行 `USE dba` 來查看架構描述 `dbo` 和 `dev`，就像在 SQL Server 中一樣。從 PostgreSQL 也可以看到未變更的結構描述名稱。

在多資料庫模式中，若從 PostgreSQL 存取，使用者資料庫的結構描述名稱變成 `dbname_schemaname`。若從 T-SQL 存取，結構描述名稱保持不變。

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


如圖所示，當透過 TDS 連接埠連線及使用 T-SQL 時，多資料庫模式和單資料庫模式與 SQL Server 相同。例如：`USE dbA` 會列出結構描述 `dbo` 和 `dev`，就如同在 SQL 伺服器中一樣。從 PostgreSQL 可以看到對應的結構描述名稱，例如 `dba_dbo` 和 `dba_dev`。

每個資料庫仍然包含您的結構描述。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 不同，在 `tempdb` 叢集重新啟動後，Babelfish 不會重新初始化。

在下列情況下，請使用單一資料庫遷移模式：
+ 如果您遷移單一 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
```

您可以在叢集建立過程中變更以下設定，但其中一些設定一旦儲存在自訂參數群組後就無法變更，因此請謹慎選擇：
+ 單一資料庫或多個資料庫
+ 預設定序地區設定
+ 定序名稱
+ DB parameter group (資料庫參數群組)

若要使用現有的 Aurora PostgreSQL 資料庫叢集第 13 版或更新版本的參數群組，請編輯該資料庫，並將 `babelfish_status` 參數設定為 `on`。請在建立 Aurora PostgreSQL 叢集之前指定任何 Babelfish 選項。如需詳細資訊，請參閱 [Amazon Aurora 的參數群組](USER_WorkingWithParamGroups.md)。

下列參數控制 Babelfish 偏好設定。除非在「說明」中另有說明，否則參數是可修改的。預設值包含在描述中。若要查看任何參數的允許值，請執行以下操作：

**注意**  
當您建立新資料庫參數群組與資料庫執行個體的關聯時，只有在資料庫執行個體重新開機之後，才會套用修改過的靜態參數和動態參數。不過，如果您在將資料庫參數群組與資料庫執行個體建立關聯之後修改該群組中的動態參數，則會立即套用這些變更，而不需重新開機。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

1. 從導覽功能表中，選擇 **Parameter groups** (參數群組)。

1. 從清單中選擇 `default.aurora-postgresql14` 資料庫叢集參數群組。

1. 在搜尋欄位中輸入參數的名稱。例如，在搜尋欄位中輸入 `babelfishpg_tsql.default_locale` 以顯示此參數，以及其預設值和允許的設定。
**注意**  
只有在那些區域中開啟下列參數時，Babelfish for Aurora PostgreSQL 全域資料庫才會在次要區域中運作。


| 參數 | Description | 套用類型 | 是可修改的 | 
| --- | --- | --- | --- | 
| 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\$1encrypt | 此布林值會針對周遊 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'，'TLSv1' 適用於 Aurora PostgreSQL 第 16 版之前的版本) (允許值：'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，single-db 適用於 Aurora PostgreSQL 第 16 版之前的版本) (允許值：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) (允許值：default)  | 動態 | 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>

若需要連至 Babelfish for Aurora PostgreSQL 資料庫叢集的 SSL/TLS 連線，請使用 `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 會比較用戶端交握期間傳送的 Secure Sockets Layer (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 | 任何 | 任何 | 否，關閉連線 | 不支援 | 

# 了解 Babelfish for Aurora PostgreSQL 中的定序
<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 使用第 153.80 版 International Components for Unicode (ICU) 定序程式庫。如需 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_tw/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 編碼的字元順序相同。字碼指標順序是快速的確定性定序。 | 
| CIS | 不區分大小寫。 | 
| 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  |  也稱為 CP1252 的[非確定性定序](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1252.txt)。  | 
|  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  |  支援簡體中文的非確定性定序。  | 
|  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  |  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  |  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  |  French\$1CS\$1AS  |  French\$1CI\$1AS French\$1CI\$1AI  | 
|  Greek  |  Greek\$1CS\$1AS  |  Greek\$1CI\$1AS Greek\$1CI\$1AI  | 
|  Hebrew  |  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  |  Mongolian\$1CS\$1AS  |  Mongolian\$1CI\$1AS Mongolian\$1CI\$1AI  | 
|  Polish  |  Polish\$1CS\$1AS  |  Polish\$1CI\$1AS Polish\$1CI\$1AI  | 
|  Thai  |  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  | 
|  Turkish  |  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  |  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`) 定序將標點符號和其他非英數字元排在數值字元前面，並將數值字元排在字母字元前面。但是，標點符號和其他特殊字元的順序不同。
+ **Tertiary collations, workaround for ORDER BY** – SQL 定序 (例如 `SQL_Latin1_General_Pref_CP1_CI_AS`) 支援 `TERTIARY_WEIGHTS` 函數，且能夠將 `CI_AS` 定序中視為同等的字串排序為大寫優先：`ABC`、`ABc`、`AbC`、`Abc`、`aBC`、`aBc`、`abC`，最後是 `abc`。因此，`DENSE_RANK OVER (ORDER BY column)` 分析函數將這些字串評估為相同等級，但在分割區內以大寫優先來排序。

  在 Babelfish 中，您可以在指定第三級 `CS_AS` 定序的 `ORDER BY` 子句中，新增 `COLLATE` 子句來指定 `@colCaseFirst=upper`，以獲得類似的結果。不過，`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 Basic Multilingual Plane (BMP) 以外字碼指標的字元。反之，非 SC 定序使用代理配對字元來處理增補字元。對於 Unicode 資料類型，SQL Server 可以使用 UCS-2 來表示最多 65,535 個字元，或者，如果使用增補字元，則表示完整的 Unicode 範圍 (1,114,114 個字元)。
+ **區分假名 (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 及更新版本沒有此問題。

  您可以透過以下其中一種方法解決此問題：
  + 將表達式明確轉換為區分大小寫的定序，並套用 LOUP 或 UPER 將這兩個參數進行大小寫折疊 (case-fold)。例如，`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 陳述式。  |  ignore  | 
| escape\$1hatch\$1constraint\$1name\$1for\$1default |  控制預設限制條件名稱相關的 Babelfish 行為。  |  ignore  | 
| escape\$1hatch\$1database\$1misc\$1options |  在 CREATE DATABASE 上控制與下列選項相關的 Babelfish 行為：CONTAINMENT、DB\$1CHAINING、TRUSTWORTHY、PERSISTENT\$1LOG\$1BUFFER。  |  ignore  | 
| escape\$1hatch\$1for\$1replication |  建立或更改資料表時，控制 [NOT] FOR REPLICATION 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1fulltext |  控制 FULLTEXT 功能相關的 Babelfish 行為，例如 CREATE/ALTER DATABASE 中的 DEFAULT\$1FULLTEXT\$1LANGUAGE、CREATE FULLTEXT INDEX 或 sp\$1fulltext\$1database。  |  ignore  | 
| escape\$1hatch\$1ignore\$1dup\$1key |  控制與 CREATE/ALTER TABLE 和 CREATE INDEX 相關的 Babelfish 行為。當 IGNORE\$1DUP\$1KEY=ON，如果設定為 `strict` (預設值) 將會發生錯誤，或者在設定為 `ignore` (Babelfish 1.2.0 及更高版本) 時忽略該錯誤。  |  strict  | 
| escape\$1hatch\$1index\$1clustering |  控制索引及 PRIMARY KEY 或 UNIQUE 限制條件的 CLUSTERED 或 NONCLUSTERED 關鍵字相關的 Babelfish 行為。忽略 CLUSTERED 時，仍會視為已指定 NONCLUSTERED 來建立索引或限制條件。  |  ignore  | 
| escape\$1hatch\$1index\$1columnstore |  控制 COLUMNSTORE 子句相關的 Babelfish 行為。如果指定 `ignore`，Babelfish 會建立正規 B 型樹狀結構索引。  |  strict  | 
| escape\$1hatch\$1join\$1hints |  控制 JOIN 運算子中的關鍵字行為：LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。  |  ignore  | 
| escape\$1hatch\$1language\$1non\$1english |  控制英文以外的螢幕訊息語言相關的 Babelfish 行為。Abelfish 目前僅支援 `us_english` 的螢幕訊息。SET LANGUAGE 可能使用含有語言名稱的變數，因此只能在執行時偵測已設定的實際語言。  |  strict  | 
| escape\$1hatch\$1login\$1hashed\$1password |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1misc\$1options |  忽略時，除了 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `HASHED`、`MUST_CHANGE`、`OLD_PASSWORD` 及 `UNLOCK` 之外，還會抑制其他關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1old\$1password |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `OLD_PASSWORD` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1password\$1must\$1change |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `MUST_CHANGE` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1login\$1password\$1unlock |  忽略時會抑制 `CREATE LOGIN` 和 `ALTER LOGIN` 的 `UNLOCK` 關鍵字的錯誤。  |  strict  | 
| escape\$1hatch\$1nocheck\$1add\$1constraint |  控制限制條件的 WITH CHECK 或 NOCHECK 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1nocheck\$1existing\$1constraint |  控制 FOREIGN KEY 或 CHECK 限制條件相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1query\$1hints |  控制查詢提示相關的 Babelfish 行為。此選項設定為 ignore 時，對於使用 OPTION (...) 子句指定查詢處理事宜的提示，伺服器會忽略提示。例子包括 SELECT FROM ... OPTION(MERGE JOIN HASH, MAXRECURSION 10))。  |  ignore  | 
|  escape\$1hatch\$1rowversion | 控制 ROWVERSION 和 TIMESTAMP 資料類型的行為。如需使用方式的資訊，請參閱 [使用具有限制實作的 Babelfish 功能](babelfish-compatibility.tsql.limited-implementation.md)。 | strict | 
| escape\$1hatch\$1schemabinding\$1function |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER FUNCTION 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1schemabinding\$1procedure |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER PROCEDURE 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1rowguidcol\$1column |  建立或更改資料表時，控制 ROWGUIDCOL 子句相關的 Babelfish 行為。  |  strict  | 
| escape\$1hatch\$1schemabinding\$1trigger |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER TRIGGER 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1schemabinding\$1view |  控制 WITH SCHEMABINDING 子句相關的 Babelfish 行為。預設會忽略 CREATE 或 ALTER VIEW 命令中指定的 WITH SCHEMABINDING 子句。  |  ignore  | 
| escape\$1hatch\$1session\$1settings |  控制不支援的工作階段層級 SET 陳述式相關的 Babelfish 行為。  |  ignore  | 
| escape\$1hatch\$1showplan\$1all |  控制與 SET SHOWPLAN\$1ALL 與 SET STATISTICS PROFILE 相關的 Babelfish 行為。當設定為 ignore 時，它們的行為類似於 SET BABELFISH\$1SHOWPLAN\$1ALL 和 SET BABELFISH\$1STATISTICS PROFILE；當設定為 strict 時，會無聲地將其忽略。  |  strict  | 
| escape\$1hatch\$1storage\$1on\$1partition |  定義分割時控制 `ON partition_scheme column ` 子句相關的 Babelfish 行為。Babelfish 目前未實作分割。  |  strict  | 
| escape\$1hatch\$1storage\$1options |  CREATE、ALTER DATABASE、TABLE、INDEX 中使用的任何儲存選項上的逃生艙 這包括子句 (LOG) ON、TEXTIMGE\$1ON、FILESTREAM\$1ON，用於定義資料表、索引、限制條件及資料庫的儲存位置 (分割區、檔案群組)。此逃生艙設定套用至以上所有子句 (包括 ON [PRIMARY] 和 ON "DEFAULT")。但以 ON partition\$1scheme (column) 指定資料表或索引的分割區時例外。  |  ignore  | 
| escape\$1hatch\$1table\$1hints |  控制使用 WITH (...) 子句指定的資料表提示的行為。  |  ignore  | 
| escape\$1hatch\$1unique\$1constraint |  設定為嚴格時，SQL Server 和 PostgreSQL 在處理索引欄上的 NULL 值方面的模糊語義差異可能會引發錯誤。語義差異只會出現於不切實際的使用案例中，因此您可將此轉義剖面設定為「忽略」以避免看到錯誤。 已從下列版本移除：3.6.0 及更新版本、4.2.0 及更新版本  |  strict  | 