Unicode のサポート(FireDAC)

提供: Appmethod Topics
移動先: 案内検索

接続の操作(FireDAC) への移動


このトピックでは、FireDAC での Unicode データおよびメタデータの取り扱いについて説明します。FireDAC では、Unicode データおよびメタデータを完全にサポートしています。ただし、アプリケーションでは、Unicode を適切に使用するための追加手順が必要になる可能性があります。

概要

ほとんどのエンタープライズクラスのデータベース アプリケーションでは、Unicode でエンコードされて渡された文字データを扱う必要があります。FireDAC では、以下をシームレスにサポートしています。

  • さまざまなシングル バイト クライアント文字セットおよびコード ページ(標準の ANSI を含む)
  • Unicode などのマルチバイト文字列(UTF8、UTF16、UCS2 エンコーディングを含む)

FireDAC の Unicode 処理は、以下によって左右されます。

  • 使用する Object Pascal のバージョン
  • クライアント文字セット(UTF8/UTF16 か ACP 互換か)
  • DBMS クライアント/ドライバ

FireDAC では、ユーザーが意識しなくても、必要に応じて Object Pascal アプリケーションと DBMS クライアント文字セットの間の文字セット変換が行われます。ただし、Unicode を完全にサポートできるのは、Unicode 対応の Object Pascal バージョン(Object Pascal 2009 以降)を使用している場合だけです。以下の表は、Object Pascal のバージョンによって、どこでどのエンコーディングを使用できるかをまとめたものです。

用途 Unicode 対応の Object Pascal 2009 以降 Unicode 非対応の Object Pascal 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 用に構成する

メモ: 変換ロスを避けるため、Object Pascal 2009 以降では DBMS クライアント文字セットを Unicode に設定することをお勧めします。

一般に、Unicode 用に接続定義を構成するには、DBMS クライアント文字セットを Unicode に設定する必要があります。その方法は、Object Pascal のバージョンと使用している DBMS ドライバによって異なります。

DBMS パラメータ
Advantage Database Server サポートされていません。
IBM DB2 Server Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。
DataSnap サーバー Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。
Firebird CharacterSet=utf8
Informix Object Pascal 2009 以降では自動的に UTF16 に設定されます。
InterBase CharacterSet=utf8
Microsoft SQL Server Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。
Microsoft Access データベース Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。

すべての文字列の列を強制的に Unicode データ型にするには、StringFormat=Unicode に設定します。

MySQL Server CharacterSet=utf8
Oracle Server
  • CharacterSet=utf8
  • または、CharacterSet が指定されていない場合には NLS_LANG=_.UTF8
PostgreSQL CharacterSet=utf8
SQLite データベース Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。

すべての文字列の列を強制的に Unicode データ型にするには、StringFormat=Unicode に設定します。

Sybase SQL Anywhere Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。
Teradata Database CharacterSet=utf8 または CharacterSet=utf16
dbExpress ブリッジ ドライバ dbExpress ドライバによって異なります。
ODBC ブリッジ ドライバ Object Pascal 2009 以降では自動的に UTF16 に設定されます。Object Pascal 2007 以前ではサポートされていません。

SQL コマンド テキスト

Object Pascal 2009 以降では、TFDQuery.SQLTFDCommand.CommandText、IFDPhysCommand.CommandText などのプロパティ値は Unicode にエンコードされます。SQL コマンド テキスト プリプロセッサでは UCS2 エンコーディングしかサポートしていません。つまり、サロゲート ペアはサポートしていません。

Object Pascal 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 スクリプト テキスト

Object Pascal 2009 以降では、TFDScript.SQLScripts コレクションに Unicode エンコードの SQL スクリプト テキストを含めることができます。それより前のバージョンでは、SQL スクリプト テキストの処理は SQL コマンド テキストの処理と同様です。

Object Pascal 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 - Object Pascal 2006 以降では ftFixedWideChar、それより前では ftWideString
  • NVARCHAR - ftWideString
  • NMEMO - Object Pascal 2006 以降では ftWideMemo、それより前では ftFmtMemo
IBM DB2 Server
  • GRAPHIC - Object Pascal 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARGRAPHIC - ftWideString
  • LONG VARGRAPHIC、DBCLOB - Object Pascal 2006 以降では ftWideMemo、それより前では ftFmtMemo
DataSnap サーバー
  • Object Pascal 2006 以降では ftFixedWideChar、ftWideString
  • Object Pascal 2006 以降では ftWideMemo、ftFmtMemo
Firebird CharacterSet が UTF8 または UNICODE_FSS の場合
  • CHAR - Object Pascal 2006 以降では ftFixedWideChar、それより前では ftWideString
  • VARCHAR - ftWideString
  • BLOB SUB_TYPE TEXT - Object Pascal 2006 以降では ftWideMemo、それより前では ftFmtMemo
Informix

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

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

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

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

CharacterSet が UTF8 の場合

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

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

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

DBX1-3:

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

DBX4:

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

Unicode 文字列値をプログラムで読み書きするには、以下を使用します。

  • TField.AsWideString または TField.Value プロパティ。
  • Object Pascal 2009 以降では、TField.AsString。それより前のバージョンの Object Pascal では、AsString が ANSI 文字列を返すため、AsString プロパティを読み書きすると変換ロスが生じる可能性があります。

任意のバージョンの Object Pascal で Unicode フィールドを読み書きするには、次のようにします。

FDQuery1.Edit;
FDQuery1.Fields[0].AsWideString := FDQuery1.Fields[0].AsWideString + 'русский' + 'english';
FDQuery1.Post;

Object Pascal 2009 で Unicode メモ フィールドを読み書きするには、次のようにします。

FDQuery1.Edit;
FDQuery1.FieldsByName('memo').Assign(Memo1.Lines);
FDQuery1.Post;

パラメータ値

Unicode エンコードのパラメータ値は、DBMS でサポートされている Unicode 文字セットに変換され、DBMS に送信されます。これは、クライアント文字セットや Object Pascal バージョンが何であっても同じです。ただし、Firebird および InterBase では、CharacterSet パラメータが UTF8 でない場合に Unicode 文字データをサーバーに送信することができません。

任意のバージョンの Object Pascal で Unicode パラメータ値を読み書きするには、AsWideString プロパティを使用します。AsString の動作は、プラットフォームによって次のように異なります。

  • NextGen(iOS および Android)プラットフォームでは、AsStringAsWideString と同等です(Unicode)。
  • それ以外のプラットフォームでは、AsStringAsAnsiString と同等です(SBCS/ANSI 文字列)。

以下に例を示します。

FDQuery1.Params[0].AsWideString := 'русский' + 'english';
// the same as following
FDQuery1.Params[0].Value := 'русский' + 'english';
FDQuery1.Params[0].DataType := ftWideString;

メタデータ値

Object Pascal 2009 以降では、以下について Unicode エンコードのメタデータ テキストがサポートされています。

  • テーブル名
  • 結果セットの列名
  • ストアド プロシージャ名
  • ストアド プロシージャのパラメータ名
  • SQL コマンドのパラメータ名
  • SQL コマンドのマクロ名
  • ユーザー名
  • スキーマ名/カタログ名

Object Pascal 2009 より前のバージョンでは、ANSI エンコードのメタデータ テキストしかサポートしていません。

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

テキスト データ ファイル

Object Pascal 2009 以降では、TFDDataMove で変換ロスなく Unicode エンコードのテキスト データ ファイルを読み書きできます。それより前のバージョンの Object Pascal でも TFDDataMove で Unicode エンコードのテキスト データ ファイルを読み書きできますが、内部的にはすべてのデータが ACP エンコードとして扱われます。そのため、変換ロスが発生する可能性があります。

エンコードは次のようにして制御することができます。

  • テキスト データ ファイルの場合には TFDDataMove.TextFileEncoding プロパティを使用します。
  • ログ ファイルの場合には、TFDScript.ScriptOptions.FileEncoding プロパティを使用します。

Unicode データ ファイルを読み取って ACP エンコードのログ ファイルを作成するには、次のようにします。

FDDataMove1.TextFileName := 'u:\data.txt';
FDDataMove1.TextFileEncoding := enUTF8;
FDDataMove1.LogFileName := 'u:\log.txt';
FDDataMove1.TextFileEncoding := enANSI;
FDDataMove1.Destination := ADQuery1;
FDDataMove1.SourceKind := skText;
FDDataMove1.Execute;

追跡出力

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

ツール

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