Unicode のサポート(FireDAC)
接続の操作(FireDAC) への移動
このトピックでは、FireDAC での Unicode データおよびメタデータの取り扱いについて説明します。FireDAC では、Unicode データおよびメタデータを完全にサポートしています。ただし、アプリケーションでは、Unicode を適切に使用するための追加手順が必要になる可能性があります。
目次
概要
ほとんどのエンタープライズクラスのデータベース アプリケーションでは、Unicode でエンコードされて渡された文字データを扱う必要があります。FireDAC では、以下をシームレスにサポートしています。
- さまざまなシングル バイト クライアント文字セットおよびコード ページ(標準の ANSI を含む)
- Unicode などのマルチバイト文字列(UTF8、UTF16、UCS2 エンコーディングを含む)
FireDAC の Unicode 処理は、以下によって左右されます。
- 使用する Delphi のバージョン
- クライアント文字セット(UTF8/UTF16 か ACP 互換か)
- DBMS クライアント/ドライバ
FireDAC では、ユーザーが意識しなくても、必要に応じて Delphi アプリケーションと DBMS クライアント文字セットの間の文字セット変換が行われます。ただし、Unicode を完全にサポートできるのは、Unicode 対応の Delphi バージョン(Delphi 2009 以降)を使用している場合だけです。以下の表は、Delphi のバージョンによって、どこでどのエンコーディングを使用できるかをまとめたものです。
用途 | Unicode 対応の Delphi 2009 以降 | Unicode 非対応の Delphi 2007 以前 |
---|---|---|
SQL コマンド テキスト | Unicode | ANSI |
SQL スクリプト テキスト | Unicode | ANSI |
結果セットのフィールド値 | Unicode/ANSI | ANSI/Unicode |
パラメータ値 | Unicode/ANSI | ANSI/Unicode |
以下を含むメタデータ値
|
Unicode | ANSI |
メタデータ クエリ値 | Unicode | Unicode |
テキスト データ ファイル | Unicode/ANSI | ANSI/Unicode |
追跡出力 | Unicode/ANSI | ANSI/Unicode |
ツール | Unicode | Unicode |
接続定義を Unicode 用に構成する
メモ: 変換ロスを避けるため、Delphi 2009 以降では DBMS クライアント文字セットを Unicode に設定することをお勧めします。
一般に、Unicode 用に接続定義を構成するには、DBMS クライアント文字セットを Unicode に設定する必要があります。その方法は、Delphi のバージョンと使用している DBMS ドライバによって異なります。
DBMS | パラメータ |
---|---|
Advantage Database Server | サポートされていません。 |
IBM DB2 Server | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。 |
DataSnap サーバー | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。 |
Firebird | CharacterSet=utf8 |
Informix | Delphi 2009 以降では自動的に UTF16 に設定されます。 |
InterBase | CharacterSet=utf8 |
Microsoft SQL Server | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。 |
Microsoft Access データベース | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。
すべての文字列の列を強制的に Unicode データ型にするには、StringFormat=Unicode に設定します。 |
MySQL Server | CharacterSet=utf8 |
Oracle Server |
|
PostgreSQL | CharacterSet=utf8 |
SQLite データベース | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。
すべての文字列の列を強制的に Unicode データ型にするには、StringFormat=Unicode に設定します。 |
Sybase SQL Anywhere | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。 |
Teradata Database | CharacterSet=utf8 または CharacterSet=utf16 |
dbExpress ブリッジ ドライバ | dbExpress ドライバによって異なります。 |
ODBC ブリッジ ドライバ | Delphi 2009 以降では自動的に UTF16 に設定されます。Delphi 2007 以前ではサポートされていません。 |
SQL コマンド テキスト
Delphi 2009 以降では、TFDQuery.SQL、TFDCommand.CommandText、IFDPhysCommand.CommandText などのプロパティ値は Unicode にエンコードされます。SQL コマンド テキスト プリプロセッサでは UCS2 エンコーディングしかサポートしていません。つまり、サロゲート ペアはサポートしていません。
Delphi 2009 より前のバージョンでは、ANSI エンコードのコマンド テキストしかサポートしていません。
SQL コマンド テキストを DBMS に送信する前に、FireDAC ではそれを次のように変換します。
- クライアント文字セットが SBCS(非 Unicode)の場合にはアクティブ コード ページに。クライアント文字セットが ACP 互換でなければ、変換ロスが発生する可能性があります。
- クライアント文字セットが UTF8 の場合には UTF8 に。
- クライアント文字セットが UTF16 の場合には UTF16 に。
Unicode エンコードの SQL コマンド テキストを指定するには、次のようにすればよいだけです。
FDQuery1.SQL.Text := 'select Hello world ! where Lang = RU and Val = Привет мир !';
SQL スクリプト テキスト
Delphi 2009 以降では、TFDScript.SQLScripts コレクションに Unicode エンコードの SQL スクリプト テキストを含めることができます。それより前のバージョンでは、SQL スクリプト テキストの処理は SQL コマンド テキストの処理と同様です。
Delphi 2009 より前のバージョンでは、ANSI エンコードのスクリプト テキストしかサポートしていません。TFDScript で Unicode エンコードの SQL スクリプト ファイルを読み込むことはできますが、ファイルは処理前に ACP(ANSI)エンコーディングに変換されます。
SQL スクリプト ファイルおよびログ ファイルのエンコーディングを制御するには、TFDScript.ScriptOptions.FileEncoding プロパティを使用してください。
FDScript1.ScriptOptions.FileEncoding := enUTF16; FDScript1.SQLScriptFileName := 'u:\builddb.sql'; FDScript1.ExecuteAll;
結果セット フィールド
DBMS | 説明 |
---|---|
Advantage Database Server |
|
IBM DB2 Server |
|
DataSnap サーバー |
|
Firebird | CharacterSet が UTF8 または UNICODE_FSS の場合
|
Informix |
接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Ansi です。 |
InterBase | CharacterSet が UTF8、UNICODE_FSS、UNICODE_LE、または UNICODE_BE の場合
|
Microsoft SQL Server |
|
Microsoft Access データベース |
接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Choose です。 |
MySQL Server | CharacterSet が UTF8 の場合
|
Oracle Server |
CharacterSet が UTF8 の場合
|
SQLite データベース | StringFormat=Choose の場合
接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Choose です。 |
PostgreSQL | CharacterSet が UTF8 の場合
|
Sybase SQL Anywhere |
|
Teradata Database | サポートされていません。 |
dbExpress ブリッジ ドライバ | dbExpress ドライバおよび DBMS によって異なります。一般的には次のとおりです。
DBX1-3:
DBX4:
|
ODBC ブリッジ ドライバ | ODBC ドライバおよび DBMS によって異なります。一般的には次のとおりです。
|
Unicode 文字列値をプログラムで読み書きするには、以下を使用します。
- TField.AsWideString または TField.Value プロパティ。
- Delphi 2009 以降では、TField.AsString。それより前のバージョンの Delphi では、AsString が ANSI 文字列を返すため、AsString プロパティを読み書きすると変換ロスが生じる可能性があります。
任意のバージョンの Delphi で Unicode フィールドを読み書きするには、次のようにします。
FDQuery1.Edit;
FDQuery1.Fields[0].AsWideString := FDQuery1.Fields[0].AsWideString + 'русский' + 'english';
FDQuery1.Post;
Delphi 2009 で Unicode メモ フィールドを読み書きするには、次のようにします。
FDQuery1.Edit;
FDQuery1.FieldsByName('memo').Assign(Memo1.Lines);
FDQuery1.Post;
パラメータ値
Unicode エンコードのパラメータ値は、DBMS でサポートされている Unicode 文字セットに変換され、DBMS に送信されます。これは、クライアント文字セットや Delphi バージョンが何であっても同じです。ただし、Firebird および InterBase では、CharacterSet
パラメータが UTF8 でない場合に Unicode 文字データをサーバーに送信することができません。
任意のバージョンの Delphi で Unicode パラメータ値を読み書きするには、AsWideString プロパティを使用します。AsString
の動作は、プラットフォームによって次のように異なります。
- NextGen(iOS および Android)プラットフォームでは、
AsString
はAsWideString
と同等です(Unicode)。 - それ以外のプラットフォームでは、
AsString
はAsAnsiString
と同等です(SBCS/ANSI 文字列)。
例:
FDQuery1.Params[0].AsWideString := 'русский' + 'english';
// The following code lines are equivalent to the previous one:
FDQuery1.Params[0].DataType := ftWideString;
FDQuery1.Params[0].Value := 'русский' + 'english';
メタデータ値
Delphi 2009 以降では、以下について Unicode エンコードのメタデータ テキストがサポートされています。
- テーブル名
- 結果セットの列名
- ストアド プロシージャ名
- ストアド プロシージャのパラメータ名
- SQL コマンドのパラメータ名
- SQL コマンドのマクロ名
- ユーザー名
- スキーマ名/カタログ名
Delphi 2009 より前のバージョンでは、ANSI エンコードのメタデータ テキストしかサポートしていません。
TFDMetaInfoCommand、TFDMetaInfoQuery、IADPhysMetaInfoCommand で返されるメタデータ結果セットの列はすべて、Unicode 文字列データ型です。
追跡出力
追跡ファイル出力(MonitorBy=FlatFile
)で、Unicode エンコーディングを有効にするには、TADMoniFlatFileClientLink.FileEncoding
プロパティ値を ecUTF8 または ecUTF16 に設定します。
ツール
FireDAC ユーティリティはすべて、Unicode に対応したバージョンの Delphi でコンパイルされているため、100% Unicode 対応しています。