Unicode のサポート(FireDAC)

提供: RAD Studio
移動先: 案内検索

接続の操作(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
  • CharacterSet=utf8
  • または、CharacterSet が指定されていない場合には NLS_LANG=_.UTF8
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.SQLTFDCommand.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
  • NCHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR - ftWideString
  • NMEMO - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
IBM DB2 Server
  • GRAPHIC - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARGRAPHIC - ftWideString
  • LONG VARGRAPHIC、DBCLOB - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
DataSnap サーバー
  • Delphi 2006 以降では ftFixedWideChar、ftWideString
  • Delphi 2006 以降では ftWideMemo、ftFmtMemo
Firebird CharacterSet が UTF8 または UNICODE_FSS の場合
  • CHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR - ftWideString
  • BLOB SUB_TYPE TEXT - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Informix

接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Ansi です。

InterBase CharacterSet が UTF8、UNICODE_FSS、UNICODE_LE、または UNICODE_BE の場合
  • CHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR - ftWideString
  • BLOB SUB_TYPE TEXT - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Microsoft SQL Server
  • NCHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR - ftWideString
  • NTEXT、NVARCHAR(MAX) - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Microsoft Access データベース
  • CHARACTER - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • MEMO - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo

接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Choose です。

MySQL Server CharacterSet が UTF8 の場合
  • CHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR、TINYTEXT - ftWideString
  • MEDIUMTEXT、TEXT、LONGTEXT - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Oracle Server
  • NCHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR2 - ftWideString
  • NCLOB - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo

CharacterSet が UTF8 の場合

  • CHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR2 - ftWideString
  • LONG、CLOB - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
SQLite データベース StringFormat=Choose の場合
  • NCHAR、NATIONAL CHAR、NATIONAL CHARACTER - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR、NVARCHAR2、NATIONAL CHARACTER VARYING、NATIONAL CHAR VARYING - ftWideString
  • TEXT、NTEXT、WTEXT、NCLOB、NMEMO、LONG NTEXT、LONG WTEXT、NATIONAL TEXT、LONGWVARCHAR - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo

接続定義パラメータが StringFormat=Unicode であれば、すべての文字列の列がワイド文字列になります。StringFormat=Ansi であれば、すべての文字列の列が ANSI 文字列になります。デフォルトでは、StringFormat=Choose です。

PostgreSQL CharacterSet が UTF8 の場合
  • CHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR - ftWideString
  • TEXT - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Sybase SQL Anywhere
  • NCHAR - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR - ftWideString
  • LONG NVARCHAR - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
Teradata Database サポートされていません。
dbExpress ブリッジ ドライバ dbExpress ドライバおよび DBMS によって異なります。一般的には次のとおりです。

DBX1-3:

  • fldZSTRING、fldstUNICODE - ftWideString
  • fldZSTRING、fldstUNICODE、fldstFIXED - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • fldBLOB、fldstMEMO、fldstUNICODE - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo
  • fldBLOB、fldstFMTMEMO - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo

DBX4:

  • TDBXDataTypes.WideStringType - ftWideString
  • TDBXDataTypes.WideStringType、TDBXDataTypes.FixedSubType - ftFixedWideChar
  • TDBXDataTypes.BlobType、TDBXDataTypes.WideMemoSubType - ftWideMemo
ODBC ブリッジ ドライバ ODBC ドライバおよび DBMS によって異なります。一般的には次のとおりです。
  • SQL_WCHAR、SQL_GRAPHIC - Delphi 2006 以降では ftFixedWideChar、それより前では ftWideString
  • SQL_WVARCHAR、SQL_VARGRAPHIC、SQL_LONGVARGRAPHIC - ftWideString
  • SQL_WLONGVARCHAR、SQL_DBCLOB - Delphi 2006 以降では ftWideMemo、それより前では ftFmtMemo

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)プラットフォームでは、AsStringAsWideString と同等です(Unicode)。
  • それ以外のプラットフォームでは、AsStringAsAnsiString と同等です(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 エンコードのメタデータ テキストしかサポートしていません。

TFDMetaInfoCommandTFDMetaInfoQuery、IADPhysMetaInfoCommand で返されるメタデータ結果セットの列はすべて、Unicode 文字列データ型です。

追跡出力

追跡ファイル出力MonitorBy=FlatFile)で、Unicode エンコーディングを有効にするには、TADMoniFlatFileClientLink.FileEncoding プロパティ値を ecUTF8 または ecUTF16 に設定します。

ツール

FireDAC ユーティリティはすべて、Unicode に対応したバージョンの Delphi でコンパイルされているため、100% Unicode 対応しています。