

# Babelfish のアーキテクチャと構成を理解する
<a name="babelfish-understanding-overview-howitworks"></a>

Babelfish を実行する Aurora PostgreSQL 互換エディション DB クラスターは、Aurora DB クラスターと同様に管理します。つまり、スケーラビリティ、フェイルオーバーサポートによる高可用性、Aurora DB クラスターによって提供される組み込みレプリケーションを利用できます。これらの機能の詳細については、「[Aurora DB クラスターのパフォーマンスとスケーリングの管理](Aurora.Managing.Performance.md)」、「[Amazon Aurora の高可用性](Concepts.AuroraHighAvailability.md)」、および「[Amazon Aurora でのレプリケーション](Aurora.Replication.md)」を参照してください。次を含む、他の多くの AWS ツールおよびユーティリティにもアクセスできます。
+ Amazon CloudWatch は、データと実用的なインサイトを提供するモニタリングおよび可観測性サービスです。詳しくは、「[Amazon CloudWatch を使用した Amazon Aurora メトリクスのモニタリング](monitoring-cloudwatch.md)」を参照してください。
+ RDS Performance Insights は、データベースのロードを迅速に評価するのに役立つ、データベースのパフォーマンスチューニングおよびモニタリング特徴です。詳細については、「[Amazon Aurora での Performance Insights を使用したDB 負荷のモニタリング](USER_PerfInsights.md)」を参照してください。
+ Aurora Global Database は複数の AWS リージョン にまたがり配置されます。これにより、低レイテンシーのグローバル読み取りを実現し、AWS リージョン 全体に影響が及ぶ可能性のある停止がまれに起きても、すばやい復旧を可能にします。詳しくは、「[Amazon Aurora Global Database の使用](aurora-global-database.md)」を参照してください。
+ 自動ソフトウェアパッチを適用すると、利用可能な状態になったときに最新のセキュリティパッチと特徴パッチを適用して、データベースを最新の状態に保ちます。
+  Amazon RDS イベントは、自動フェイルオーバーなどの重要なデータベースイベントを E メールまたは SMS メッセージで通知します。詳しくは、「[Amazon Aurora イベントのモニタリング](working-with-events.md)」を参照してください。

以下では、Babelfish アーキテクチャと、移行する SQL Server データベースが Babelfish によってどのように処理されるかについて学習します。Babelfish DB クラスターを作成するときは、1 つのデータベース、または複数のデータベース、照合順序、その他の詳細についていくつかの決定を下す必要があります。

**Topics**
+ [Babelfish のアーキテクチャ](babelfish-architecture.md)
+ [Babelfish の DB クラスターパラメータグループ設定](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_db` データベース名は 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 が提供するものと等しい、またはそれに類するクロスデータベース構文およびセマンティクスを保持します。

## 1 つのデータベースまたは複数のデータベースでの babelfish の使用
<a name="babelfish-single_vs_multi_db"></a>

Babelfish で使用する Aurora PostgreSQL クラスターを作成する場合は、単独で 1 つの SQL Server データベースを使用するか、複数の SQL Server データベースを一緒に使用するかを選択します。選択した内容は、`babelfish_db` データベース内の SQLServer スキーマの名前が Aurora PostgreSQL からどのように表示されるかに影響します。移行モードは `migration_mode` パラメータに保存されます。以前に作成したすべての SQL オブジェクトにアクセスできなくなる可能性があるため、クラスターの作成後にこのパラメータを変更しないでください。

シングルデータベースモードでは、SQL Server データベースのスキーマ名は、PostgreSQL の `babelfish_db` データベースと同じままです。1 つのデータベースだけを移行する場合には、移行したユーザーデータベースのスキーマ名は、SQL Server で使用されているのと同じ名前の PostgreSQL で参照できます。例えば、`dbo` と `smith` スキーマは `dbA`データベース内に存在します*。*

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


TDS 経由で接続すると、SQL Server の場合と同様に、`USE dba` を実行して T-SQL から スキーマ `dbo` と `dev` を表示することができます。変更されていないスキーマ名は PostgreSQL からも確認できます。

マルチデータベースモードでは、PostgreSQL からアクセスされたとき、ユーザーデータベースのスキーマ名は `dbname_schemaname` になります。T-SQL からアクセスされたときのスキーマ名は変わりません。

![\[\]](http://docs.aws.amazon.com/ja_jp/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 スキーマ名と同じです。これにより、PostgreSQL 接続で実行するように最適化する場合に、既存の SQL クエリへのコード変更を減らすことができます。
+ 最終目標がネイティブ Aurora PostgreSQL への完全移行である場合。移行する前にスキーマを 1 つのスキーマに統合 (`dbo`) し、それから単一のクラスターに移行すると、必要な変更が少なく済みます。

次の場合は、複数のデータベース移行モードを使用します。
+ 同じインスタンス内の複数のユーザーデータベースでデフォルトの SQL Server エクスペリエンスを実現する場合。
+ 複数のユーザーデータベースを一緒に移行する必要がある場合。

# Babelfish の DB クラスターパラメータグループ設定
<a name="babelfish-configuration"></a>

Aurora PostgreSQL DB クラスターを作成し、[**Babelfish をオンにする**] を選択した場合、[**新規作成**] を作成すると、DB クラスターパラメータグループが自動的に作成されます。この DB クラスターパラメータグループは、インストール用に選択された Aurora PostgreSQL DB バージョンの Aurora PostgreSQL DB クラスターパラメータグループ (例えば、Aurora PostgreSQL DB バージョン 14) に基づいています。これは、次の一般的なパターンを使用して命名されています。

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

クラスター作成プロセス中に次の設定を変更できますが、カスタムパラメータグループに保存するとこれらの一部は変更できないため、慎重に選択してください。
+ 単一データベースまたは複数のデータベース
+ デフォルトの照合ロケール
+ 照合順序名
+ DB パラメータグループ

既存の Aurora PostgreSQL DB クラスターバージョン 13 以降のパラメータグループを使用するには、グループを編集して `babelfish_status` パラメータを `on` に設定します。Aurora PostgreSQL クラスターを作成する前に、Babelfish オプションを指定してください。詳細については[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)を参照してください。

次のパラメータは、Babelfish のプリファレンスを制御します。説明に特に明記されていない限り、パラメータは変更可能です。デフォルト値は説明に含まれています。任意のパラメータの許容値を表示するには、次の手順を実行します。

**注記**  
新しい DB パラメータグループを DB インスタンスに関連付ける場合、変更された静的パラメータと動的パラメータは、DB インスタンスが再起動された後にのみ適用されます。ただし、DB インスタンスに関連付けた後に DB パラメータグループの動的パラメータを変更すると、これらの変更は再起動せずに直ちに適用されます。

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインから [**パラメータグループ**] を選択します。

1. リストから、`default.aurora-postgresql14` DB クラスターのパラメータグループを選択します。

1. 検索フィールドにパラメータの名前を入力します。例えば、検索フィールドに `babelfishpg_tsql.default_locale` を入力して、このパラメータとそのデフォルト値、および許容される設定を表示します。
**注記**  
Babelfish for Aurora PostgreSQL グローバルデータベースは、次のパラメータが有効になっている場合にのみ, セカンダリリージョンで機能します。


| パラメータ | 説明 | 適用タイプ | 変更可能 | 
| --- | --- | --- | --- | 
| babelfishpg\$1tsql.apg\$1enable\$1correlated\$1scalar\$1transform | プランナーが Babelfish で相関スカラーサブクエリを変換できるようにします。(デフォルト: on) (許容値: on、off)  | dynamic | true | 
| babelfishpg\$1tsql.apg\$1enable\$1subquery\$1cache | Babelfish で相関スカラーサブクエリのキャッシュの使用を有効にします。(デフォルト: on) (許容値: on、off)  | dynamic | true | 
| babelfishpg\$1tds.tds\$1default\$1numeric\$1scale | エンジンがスケールを指定していない場合、TDS 列メタデータで送信される数値型のデフォルトスケールを設定します。(デフォルト: 8) (許容値: 0 ～ 38)  | dynamic | true | 
| babelfishpg\$1tds.tds\$1default\$1numeric\$1precision | エンジンが精度を指定していない場合、TDS 列のメタデータで送信される数値型のデフォルト精度を設定する整数。(デフォルト: 38) (許容値: 1 ～ 38) | dynamic | true | 
| babelfishpg\$1tds.tds\$1default\$1packet\$1size | SQL Server クライアントを接続するためのデフォルトのパケットサイズを設定する整数。(デフォルト: 4096) (許容値: 512 ～ 32767) | dynamic | 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) | dynamic | true | 
| babelfishpg\$1tds.default\$1server\$1name | Babelfish サーバーのデフォルト名を識別する文字列。(デフォルト: Microsoft SQL Server) (許容値: null) | dynamic | true | 
| babelfishpg\$1tds.tds\$1debug\$1log\$1level | TDS のロギングレベルを設定します。0 はロギングをオフにする整数。(デフォルト: 1) (許容値: 0、1、2、3) | dynamic | true | 
| babelfishpg\$1tds.listen\$1addresses | TDS をリッスンするためのホスト名、IP アドレス、またはアドレスを設定する整数。Babelfish DB クラスターの作成後にこのパラメータを変更することはできません。(デフォルト: \$1) (許容値: null)  | – | false | 
| babelfishpg\$1tds.port | SQL Server 構文でのリクエストに使用する TCP ポートを設定する整数。(デフォルト: 1433) (許容値: 1 ～ 65535) | static | true | 
| babelfishpg\$1tds.tds\$1ssl\$1encrypt | TDS リスナーポートを通過するデータの暗号化をオン (0) またはオフ (1) にするブール値。SSL を使用したクライアント接続の詳細については、[Babelfish SSL 設定とクライアント接続](#babelfish-ssl) を参照してください。(デフォルト: 00) (許容値: 0、1) | dynamic | true | 
| babelfishpg\$1tds.tds\$1ssl\$1max\$1protocol\$1version | TDS セッションに使用する最高の SSL/TLS プロトコルバージョンを指定する文字列。(デフォルト: 'TLSv1.2') (許容値: 'TLSv1'、'TLSv1.1'、'TLSv1.2') | dynamic | 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」) | dynamic | true | 
| babelfishpg\$1tds.unix\$1socket\$1directories | TDS サーバーの Unix ソケットディレクトリを識別する文字列。Babelfish DB クラスターの作成後にこのパラメータを変更することはできません。(デフォルト: /tmp) (許容値: null) | – | false | 
| babelfishpg\$1tds.unix\$1socket\$1group | TDS サーバーの Unix ソケットグループを識別する文字列。Babelfish DB クラスターの作成後にこのパラメータを変更することはできません。(デフォルト: rdsdb) (許容値: null) | – | false | 
| babelfishpg\$1tsql. default\$1locale |  Babelfish 照合に使用されるデフォルトのロケールを指定する文字列。デフォルトのロケールはロケールで、修飾子は含まれません。 Babelfish DB クラスターをプロビジョニングするときに、このパラメータを設定します。DB クラスターのプロビジョニング後、このパラメータへの変更は無視されます。(デフォルト: en\$1US) (許容値: [tables](babelfish-collations.md) を参照)   | static | true | 
| babelfishpg\$1tsql.migration\$1mode |  単一または複数のユーザーデータベースのサポートを指定する変更不可能なリスト。Babelfish DB クラスターをプロビジョニングするときに、このパラメータを設定します。DB クラスターのプロビジョニング後は、このパラメータの値を変更できません。(デフォルト: Aurora PostgreSQL バージョン 16 の multi-db、Aurora PostgreSQL バージョン 16 以前のバージョンでは single-db) (許容値: single-db、multi-db、null)  | static | true | 
| babelfishpg\$1tsql.server\$1collation\$1name |  サーバーレベルのアクションに使用される照合の名前を指定する文字列。Babelfish DB クラスターをプロビジョニングするときに、このパラメータを設定します。DB クラスターのプロビジョニング後は、このパラメータの値を変更しないでください。(デフォルト: bbf\$1unicode\$1general\$1ci\$1as) (許容値: [tables](babelfish-collations.md) を参照)  | static | true | 
| babelfishpg\$1tsql.version |  @@VERSION 変数の出力を設定する文字列。Aurora PostgreSQL DB クラスターのこの値は変更しないでください。(デフォルト: null) (許容値: デフォルト)  | dynamic | true | 
| rds.babelfish\$1status | Babelfish 機能の状態を設定する文字列。このパラメータが `datatypesonly` に設定されている場合、Babelfish はオフになりますが、SQL Server のデータ型は引き続き使用できます。(デフォルト: off) (許容値: on、off、datatypesonly) | static | true | 
| unix\$1socket\$1permissions | TDS サーバーの Unix ソケットパーミッションを設定する整数。Babelfish DB クラスターの作成後にこのパラメータを変更することはできません。(デフォルト: 0700) (許容値: 0 ～ 511) | – | false | 

## Babelfish SSL 設定とクライアント接続
<a name="babelfish-ssl"></a>

Babelfish for Aurora PostgreSQL DB クラスターへの 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 (オフ) に設定することで、以前のデフォルトの動作に戻すことができます。

ドライバー固有の詳細については、「[BabelfishDB クラスターへの接続](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 DB クラスターを作成するときは、データの照合を選択します。照合順序は、特定の人間言語で書かれたテキストまたは文字を生成するソート順とビットパターンを指定します。照合順序には、特定のビットパターンのセットに対してデータを比較するルールが含まれます。照合順序はローカリゼーションに関連しています。ロケールが異なると、文字マッピング、ソート順などに影響します。照合順序の属性は、さまざまな照合順序の名前に反映されます。属性の詳細については、「[Babelfish collation attributes table](#bfish-collation-attributes-table)」を参照してください。

Babelfish は、Babelfish が提供する同等の照合に SQL Server 照合をマッピングします。Babelfish は、文化的に敏感な文字列比較とソート順で、 Unicode 照合を事前に定義しています。また Babelfish は、SQL Server DB 内の照合を最も近い Babelfish 照合に変換する方法も提供します。ロケール固有の照合順序は、異なる言語および地域に対して提供されます。

一部の照合では、クライアント側のエンコーディングに対応したコードページを指定します。Babelfish は、各出力列の照合順序に応じて、サーバーエンコーディングからクライアントエンコーディングに自動的に変換します。

Babelfish は、「[Babelfish supported collations table](#bfish-collations-table)」に列挙された照合順序をサポートしています。Babelfish は、Babelfish が提供する同等の照合に SQL Server 照合をマッピングします。

Babelfish は International Components for Unicode (ICU) 照合順序ライブラリのバージョン 153.80 を使用しています。ICU 照合の詳細については、ICU ドキュメントの「[Collation](https://unicode-org.github.io/icu/userguide/collation/)」(照合順序) を参照してください。PostgreSQL と照合の詳細については、PostgreSQL ドキュメントの「[照合順序のサポート](https://www.postgresql.org/docs/current/collation.html)」を参照してください。

**Topics**
+ [照合順序とロケールを制御する DB クラスターパラメータ](#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)

## 照合順序とロケールを制御する DB クラスターパラメータ
<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 DB クラスターでこのパラメータの設定を変更しても、既存の照合順序のロケールには影響しません。照合の一覧については、「[Babelfish supported collations table](#bfish-collations-table)」を参照してください。

**babelfishpg\$1tsql.server\$1collation\$1name**  
このパラメータは、サーバー (Aurora PostgreSQL DB クラスターインスタンス) とデータベースのデフォルトの照合順序を指定します。デフォルト値は `sql_latin1_general_cp1_ci_as` です。T-SQL では、サーバーの照合順序によって識別子の比較方法が決定されるため、`CI_AS` 照合順序は `server_collation_name` でなければならなりません。  
Babelfish DB クラスターを作成するときは、選択リストから [**照合順序名**] を選択します。これらには、「[Babelfish supported collations table](#bfish-collations-table)」に列挙された照合順序が含まれます。belfish データベースの作成後は、`server_collation_name` を変更しないでください。

Babelfish for Aurora PostgreSQL DB クラスターの作成時に選択した設定は、これらのパラメータのクラスターに関連付けられた DB クラスターパラメータグループに格納され、照合動作を設定します。

## 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 句はサポートしていません。  | 
|  LIKE 句は、Babelfish バージョン 4.2.0 の次の AI 照合でのみサポートされます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/babelfish-collations.html)  |  非決定的照合順序に関する LIKE 句はサポートしていません。  | 

SQL Server および PostgreSQL と比較した Babelfish の他の制限および動作の違いについては、「[照合順序の制限と動作の違い](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  |  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  |  中国語 (PRC) をサポートする非決定的照合順序。  | 
|  cyrillic\$1general\$1ci\$1as  |  キリル文字をサポートする非決定的照合順序。  | 
|  finnish\$1swedish\$1ci\$1as  |  フィンランド語をサポートする非決定的照合順序。  | 
|  french\$1ci\$1as  |  フランス語をサポートする非決定的照合順序。  | 
|  japanese\$1ci\$1as  | 日本語をサポートする非決定的照合順序。Supported in Babelfish 2.1.0 and higher releases。 | 
|  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  |  ウクライナ語をサポートする非決定的な照合順序。  | 
|  vietamese\$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 にアップグレードすると、DB クラスターの作成時にデフォルトの照合が自動的に選択されるため、目に見える影響はありません。

# 照合順序の管理
<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 で構築されており、照合の 1 つのバージョンにだけ一致させることができます。バージョン間のバリエーションは避けられません。言語は時間と共に進化するため、マイナーなバリエーションも同様です。次のセクションでは、Babelfish 照合順序の既知制限と動作のバリエーションをいくつか示しています。
+ **インデックスおよび照合順序タイプ依存関係** – International Components for Unicode (ICU) 照合ライブラリ (Babelfish が使用するライブラリ) に依存するユーザー定義型のインデックスは、ライブラリのバージョンを変更しても無効になりません。
+ **照合関数** – 照合プロパティは、サポートされている 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)` 分析関数は、これらの文字列を同じランクとして評価しますが、パーティション内でまず大文字で並べ替えます。

  `@colCaseFirst=upper` を指定する三次 `CS_AS` 照合 を明記した `ORDER BY` 句に `COLLATE` 句を追加することで、Babelfish でも同様の結果が得られます。ただし、`colCaseFirst` 修飾子は 3 次と等しい (`CI_AS` 照合順序のような二次等照合順序ではなく) 文字列にのみ適用されます。したがって、1 つの ICU 照合を使用して 3 次 SQL 照合をエミュレートすることはできません。

  回避策として、`BBF_SQL_Latin1_General_CP1_CI_AS` 照合順序を使う前に `SQL_Latin1_General_Pref_CP1_CI_AS` 照合を使用するアプリケーションを変更することをお勧めします。その後、このカラムの `ORDER BY` 句に `COLLATE BBF_SQL_Latin1_General_Pref_CP1_CS_AS` を追加します。
+ **文字拡張** - 文字拡張では、1 文字を 1 次レベルの文字シーケンスと等しく扱います。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 ルールを使用して char 文字列と varchar 文字列をソートするのと同じ方法で、 nchar 文字列と nvarchar 文字列をソートします。
+ **補足文字** - SQL Server 関数 `NCHAR`、`UNICODE`、および `LEN` は Unicode 基本多言語平面 (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 照合と同じ機能を提供する場合があります。ただし、SQL Server と同じ名前の KS 照合は現在 Babelfish でサポートされていません。
+ **幅を区別する (WS) 照合順序** - 同じ文字が 半角文字 (半角) と 全角文字 (全角) で別扱いされる場合、照合は*幅を区別する (WS)* と呼ばれます。SQL Server と同じ名前の WS 照合は、現在 Babelfish でサポートされていません。
+ **バリエーションセレクタを区別する (VSS) 照合** — バリエーションセレクタを区別する（VSS）照合では、日本語の照合順序 `Japanese_Bushu_Kakusu_140` と `Japanese_XJIS_140` における表意文字バリエーションセレクタを区別します。バリエーションシーケンスは、基本文字と追加のバリエーションセレクタで構成されます。`_VSS` オプションを選択しない場合、バリエーションセレクタは比較には考慮されません。

  VSS 照合は、現在 Babelfish はサポートされていません。
+ **BIN および BIN2 照合** – BIN2 照合では、コードポイントの順序に従って文字がソートされます。UTF-8 のバイト単位のバイナリ順序は Unicode コードポイントの順序を保持するため、これが最もパフォーマンスの高い照合になる可能性もあります。Unicode コードポイントの順序がアプリケーションで機能する場合は、BIN2 照合の使用を検討してください。ただし、BIN2 照合を使用すると、文化的に予期しない順序でデータがクライアントに表示されることがあります。小文字への新しいマッピングは時間の経過とともに Unicode に追加されるため、ICU のバージョンによって、`LOWER` 関数の動作が異なる場合があります。これは BIN2 照合に固有なケースではなく、より一般的な照合バージョニング管理の特殊な不具合ケースです。

  Babelfish は Unicode コードポイント順に照合すため、 Babelfish ディストリビューションで `BBF_Latin1_General_BIN2` 照合を提供します。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 または UPPER を適用して両方の引数で大文字と小文字を区別します。例えば、`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` を実行します。
+ 現在のセッションまたはクラスター全体の名前付きエスケープハッチングとその値を一覧表示するには、`hatch_name` が 1 つ以上のエスケープハッチングの識別子になっている `sp_babelfish_configure 'hatch_name'` コマンドを実行します。*hatch\$1name* は「%」などの SQL ワイルドカードを使用できます。
+ 1 つまたは複数のエスケープハッチングを指定した値に設定するには、`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 |  CREATE/ALTER DATABASE の DEFAULT\$1FULLTEXT\$1LANGUAGE や CREATE FULLTEXT INDEX、 また sp\$1fulltext\$1database などの FULLTEXT 機能に関連する Babelfish の動作を制御します。  |  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 |  インデックス、プライマリキー、または UNIQUE 制約のクラスタ化キーワードまたは非クラスタ化キーワードに関連する Babelfish の動作を制御します。CLUSTERED が無視された場合も、インデックスまたは制約は NONCLUSTERED が指定されているかのように作成されます。  |  ignore  | 
| escape\$1hatch\$1index\$1columnstore |  COLUMNSTORE 句に関連する Babelfish の動作を制御します。`ignore` を指定した場合、Babelfish は通常の B-tree インデックスを作成します。  |  strict  | 
| escape\$1hatch\$1join\$1hints |  JOIN 演算子のキーワードの動作を制御します: LOOP、HASH、MERGE、REMOTE、REDUCE、REDISTRIBUTE、REPLICATE。  |  ignore  | 
| escape\$1hatch\$1language\$1non\$1english |  画面上のメッセージの英語以外の言語に関する Babelfish の動作を制御します。Babelfish は現在 画面上のメッセージのみで `us_english` をサポートされます。SET LANGUAGE は言語名を含む可変を使用する場合があるため、設定されている実際の言語はランタイムでのみ検出できます。  |  strict  | 
| escape\$1hatch\$1login\$1hashed\$1password |  無視された場合は、`CREATE LOGIN` と`ALTER LOGIN` の `HASHED` キーワードに対するエラーが抑制されます。  |  strict  | 
| escape\$1hatch\$1login\$1misc\$1options |  無視された場合は、`HASHED`、`MUST_CHANGE`、`OLD_PASSWORD`、および `UNLOCK` 以外の他のキーワード、そして `CREATE LOGIN` と `ALTER LOGIN` に対するエラーが抑制されます。  |  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 の動作を制御します。このオプションが 無視するよう設されていると、サーバーは OPTION (...) 句を使用してクエリ処理の側面を指定するヒントを無視します。例に含まれるのは SELECT FROM… OPTION(MERGE JOIN HASH, MAXRECURSION 10))  |  ignore  | 
|  escape\$1hatch\$1rowversion | ROWVERSION および TIMESTAMP のデータ型の動作を制御します。使用に関する情報については、「[実装が制限されている機能](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、TEXTIMAGE\$1ON、FILESTREAM\$1ON が含まれます。このエスケープハッチの設定は、これらすべての句 (ON [PRIMARY] および ON [DEFAULT] を含む) に適用されます。例外は、ON partition\$1scheme (カラム) を持つテーブルまたはインデックスにパーティションが指定されている場合です。  |  ignore  | 
| escape\$1hatch\$1table\$1hints |  WITH (…) 句を使って指定されたテーブルヒントの動作を制御します。  |  ignore  | 
| escape\$1hatch\$1unique\$1constraint |  strict に設定すると、インデックス付き列の NULL 値の処理における SQL Server と PostgreSQL のあいまいな意味の違いにより、エラーが発生することがあります。意味の違いは非現実的なユースケースでのみ発生するため、このエスケープハッチを「無視」に設定して、エラーが表示されないようにすることができます。 次のバージョンから廃止: 3.6.0 以降のバージョン、4.2.0 以降のバージョン  |  strict  | 