Unicode-Unterstützung (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Verbindungen (FireDAC)


In diesem Thema wird beschrieben, wie FireDAC mit Unicode-Daten und -Metadaten arbeitet. FireDAC unterstützt Unicode-Daten und -Metadaten vollständig. Allerdings müssen in einer Anwendung möglicherweise einige Anpassungen vorgenommen werden, damit Unicode ordnungsgemäß verwendet werden kann.

Allgemeine Informationen

Die meisten Anwendungen für Unternehmensdatenbanken müssen mit Zeichendaten arbeiten können, die im Unicode-Format codiert sind. FireDAC bietet eine vollständige Unterstützung für:

  • verschiedene Einzelbyte-Client-Zeichensätze und -Codeseiten, einschließlich Standard-ANSI.
  • Multibyte-Strings, wie Unicode, einschließlich der Codierungen UTF8, UTF16 und UCS2.

Die Behandlung von Unicode durch FireDAC hängt von Folgendem ab:

  • der verwendeten Delphi-Version.
  • dem Client-Zeichensatz – UTF8/UTF16- oder ACP-kompatibel.
  • dem DBMS-Client/Treiber.

FireDAC führt bei Bedarf eine transparente Zeichensatzkonvertierung zwischen dem Delphi-Anwendungs- und dem DBMS-Client-Zeichensatz durch. Die vollständige Unicode-Unterstützung kann nur mit der Unicode-Delphi-Version – Delphi 2009 und höher – erreicht werden. Die folgende Tabelle enthält eine Übersicht darüber, welche Codierung abhängig von der Delphi-Version wo verwendet werden kann:

Verwendung Unicode-fähiges Delphi 2009 und später Nicht-Unicode-fähiges Delphi 2007 und früher
SQL-Anweisungstext Unicode ANSI
SQL-Skripttext Unicode ANSI
Feldwerte in Ergebnismengen Unicode / ANSI ANSI / Unicode
Parameterwerte Unicode / ANSI ANSI / Unicode
Metadatenwerte, einschließlich:
  • Spaltennamen
  • Tabellennamen
  • Generatornamen
  • Indexnamen
  • usw.
Unicode ANSI
Abfragewerte von Metadaten Unicode Unicode
Textdatendateien Unicode / ANSI ANSI / Unicode
Ablaufverfolgungsausgabe Unicode / ANSI ANSI / Unicode
Tools Unicode Unicode

Konfigurieren von Verbindungsdefinitionen für Unicode

Hinweis: Setzen Sie für Delphi 2009 und höher den DBMS-Client-Zeichensatz auf Unicode, um Konvertierungsverluste zu vermeiden.

Im Allgemeinen muss der DBMS-Client-Zeichensatz auf Unicode gesetzt werden, um Verbindungsdefinitionen für Unicode zu konfigurieren. Wie dies ausgeführt wird, ist von der verwendeten Delphi-Version und dem DBMS-Treiber abhängig:

DBMS Parameter
Advantage Database Server Nicht unterstützt.
IBM DB2 Server Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.
DataSnap-Server Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.
Firebird CharacterSet=utf8.
Informix Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt.
InterBase CharacterSet=utf8.
Microsoft SQL Server Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.
Microsoft Access-Datenbank Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.

Legen Sie "StringFormat=Unicode" fest, damit alle String-Spalten auf Unicode-Datentypen eingestellt werden.

MySQL Server CharacterSet=utf8.
Oracle Server
  • CharacterSet=utf8.
  • oder NLS_LANG=_.UTF8, wenn CharacterSet nicht angegeben ist.
PostgreSQL CharacterSet=utf8.
SQLite-Datenbank Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.

Legen Sie "StringFormat=Unicode" fest, damit alle String-Spalten auf Unicode-Datentypen eingestellt werden.

Sybase SQL Anywhere Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.
Teradata Database CharacterSet=utf8 oder CharacterSet=utf16.
dbExpress-Brückentreiber Abhängig vom dbExpress-Treiber.
ODBC-Brückentreiber Wird in Delphi 2009 und höher automatisch auf UTF16 gesetzt. Wird in Delphi 2007 oder früher nicht unterstützt.

SQL-Anweisungstext

Ab Delphi 2009 sind TFDQuery.SQL, TFDCommand.CommandText, IFDPhysCommand.CommandText und andere Eigenschaftswerte in Unicode codiert. Der Präprozessor für SQL-Anweisungstext unterstützt nur die UCS2-Codierungen, d. h. Surrogatpaare werden nicht unterstützt.

Versionen vor Delphi 2009 unterstützen nur in ANSI codierten Anweisungstext.

Vor dem Senden von SQL-Anweisungstext an das DBMS, konvertiert FireDAC ihn in:

  • Die aktive Codeseite, wenn der Client-Zeichensatz auf SBCS (Nicht-Unicode) gesetzt ist. Wenn der Client-Zeichensatz nicht mit ACP kompatibel ist, sind Konvertierungsverluste möglich.
  • UTF8, wenn der Client-Zeichensatz auf UTF8 gesetzt ist.
  • UTF16, wenn der Client-Zeichensatz auf UTF16 gesetzt ist.

Führen Sie einfach Folgendes aus, um einen in Unicode codierten SQL-Anweisungstext anzugeben:

FDQuery1.SQL.Text := 'select Hello world ! where Lang = RU and Val = Привет мир !';

SQL-Skripttext

Ab Delphi 2009 können TFDScript.SQLScripts-Sammlungen in Unicode codierten SQL-Skripttext enthalten. Ansonsten wird die Verarbeitung von SQL-Skripttext genauso wie die Verarbeitung von SQL-Anweisungstext ausgeführt.

Versionen vor Delphi 2009 unterstützen nur in ANSI codierten Skripttext. TFDScript kann in Unicode codierte SQL-Skriptdateien laden, aber sie werden vor der Verarbeitung in die ACP-Codierung (ANSI) konvertiert.

Verwenden Sie die Eigenschaft TFDScript.ScriptOptions.FileEncoding, um die Codierung von SQL-Skriptdateien und Protokolldateien zu steuern:

FDScript1.ScriptOptions.FileEncoding := enUTF16;
FDScript1.SQLScriptFileName := 'u:\builddb.sql';
FDScript1.ExecuteAll;

Felder in Ergebnismengen

DBMS Beschreibung
Advantage Database Server
  • NCHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • NVARCHAR – ftWideString
  • NMEMO – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
IBM DB2 Server
  • GRAPHIC – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARGRAPHIC – ftWideString
  • LONG VARGRAPHIC, DBCLOB – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
DataSnap-Server
  • ftFixedWideChar für Delphi 2006 und höher und ftWideString
  • ftWideMemo für Delphi 2006 und höher und ftFmtMemo
Firebird Wenn CharacterSet auf UTF8 oder UNICODE_FSS gesetzt ist, dann:
  • CHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARCHAR – ftWideString
  • BLOB SUB_TYPE TEXT – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Informix

Wenn der Verbindungsdefinitionsparameter StringFormat=Unicode, dann sind alle String-Spalten Wide-Strings. Wenn StringFormat=Ansi, dann sind alle String-Spalten ANSI-Strings. Vorgabe: StringFormat=Ansi.

InterBase Wenn CharacterSet auf UTF8, UNICODE_FSS, UNICODE_LE oder UNICODE_BE gesetzt ist, dann:
  • CHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARCHAR – ftWideString
  • BLOB SUB_TYPE TEXT – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Microsoft SQL Server
  • NCHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • NVARCHAR – ftWideString
  • NTEXT, NVARCHAR(MAX) – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Microsoft Access-Datenbank
  • CHARACTER – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • MEMO – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo

Wenn der Verbindungsdefinitionsparameter StringFormat=Unicode, dann sind alle String-Spalten Wide-Strings. Wenn StringFormat=Ansi, dann sind alle String-Spalten ANSI-Strings. Vorgabe: StringFormat=Choose.

MySQL Server Wenn CharacterSet auf UTF8 gesetzt ist, dann:
  • CHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARCHAR, TINYTEXT – ftWideString
  • MEDIUMTEXT, TEXT, LONGTEXT – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Oracle Server
  • NCHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • NVARCHAR2 – ftWideString
  • NCLOB – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo

Wenn CharacterSet auf UTF8 gesetzt ist, dann:

  • CHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARCHAR2 – ftWideString
  • LONG, CLOB – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
SQLite-Datenbank Wenn StringFormat=Choose, dann:
  • NCHAR, NATIONAL CHAR, NATIONAL CHARACTER – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • NVARCHAR, NVARCHAR2, NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING – ftWideString
  • TEXT, NTEXT, WTEXT, NCLOB, NMEMO, LONG NTEXT, LONG WTEXT, NATIONAL TEXT, LONGWVARCHAR – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo

Wenn der Verbindungsdefinitionsparameter StringFormat=Unicode, dann sind alle String-Spalten Wide-Strings. Wenn StringFormat=Ansi, dann sind alle String-Spalten ANSI-Strings. Vorgabe: StringFormat=Choose.

PostgreSQL Wenn CharacterSet auf UTF8 gesetzt ist, dann:
  • CHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • VARCHAR – ftWideString
  • TEXT – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Sybase SQL Anywhere
  • NCHAR – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • NVARCHAR – ftWideString
  • LONG NVARCHAR – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
Teradata Database Nicht unterstützt.
dbExpress-Brückentreiber Hängt vom dbExpress-Treiber und dem DBMS ab. Allgemeine Regel:

DBX1-3:

  • fldZSTRING, fldstUNICODE – ftWideString
  • fldZSTRING, fldstUNICODE, fldstFIXED – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • fldBLOB, fldstMEMO, fldstUNICODE – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo
  • fldBLOB, fldstFMTMEMO – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo

DBX4:

  • TDBXDataTypes.WideStringType – ftWideString
  • TDBXDataTypes.WideStringType, TDBXDataTypes.FixedSubType – ftFixedWideChar
  • TDBXDataTypes.BlobType, TDBXDataTypes.WideMemoSubType – ftWideMemo
ODBC-Brückentreiber Hängt vom ODBC-Treiber und dem DBMS ab. Allgemeine Regel:
  • SQL_WCHAR, SQL_GRAPHIC – ftFixedWideChar für Delphi 2006 und höher, ansonsten ftWideString
  • SQL_WVARCHAR, SQL_VARGRAPHIC, SQL_LONGVARGRAPHIC – ftWideString
  • SQL_WLONGVARCHAR, SQL_DBCLOB – ftWideMemo für Delphi 2006 und höher, ansonsten ftFmtMemo

Verwenden Sie zum programmgesteuerten Lesen/Schreiben von Unicode-String-Werten:

  • Die Eigenschaft TField.AsWideString oder TField.Value.
  • TField.AsString für Delphi 2009 und höher. In früheren Versionen von Delphi kann das Lesen/Schreiben der Eigenschaft AsString zu Konvertierungsverlusten führen, weil AsString hier ANSI-Strings zurückgibt.

So lesen/schreiben Sie das Unicode-Feld in beliebigen Delphi-Versionen:

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

So lesen/schreiben Sie das Unicode-Memofeld in Delphi 2009:

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

Parameterwerte

Der in Unicode codierte Parameterwert wird in einen vom DBMS unterstützten Unicode-Zeichensatz konvertiert und an das DBMS gesendet. Dies ist nicht von einem Client-Zeichensatz oder einer Delphi-Version abhängig. Firebird und InterBase können keine Unicode-Zeichendaten an einen Server senden, wenn der Parameter CharacterSet nicht UTF8 ist.

Verwenden Sie zum Lesen/Schreiben eines Unicode-Parameterwertes für alle Delphi-Versionen die Eigenschaft AsWideString. Das Verhalten von AsString ist plattformabhängig:

  • Auf Plattformen der nächsten Generation (iOS und Android) ist AsString äquivalent zu AsWideString (Unicode).
  • Auf anderen Plattformen ist AsString äquivalent zu AsAnsiString (SBCS/ANSI-Strings).

Zum Beispiel:

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';

Metadatenwerte

Ab Delphi 2009 wird in Unicode codierter Metadatentext unterstützt für:

  • Tabellennamen
  • Spaltennamen in Ergebnismengen
  • Namen von gespeicherten Prozeduren
  • Parameternamen von gespeicherten Prozeduren
  • Parameternamen von SQL-Anweisungen
  • Makro-Namen von SQL-Anweisungen
  • Benutzernamen
  • Schema-, Katalognamen

Versionen vor Delphi 2009 unterstützen nur in ANSI codierten Metadatentext.

Alle Spalten in Metadatenergebnismengen, die von TFDMetaInfoCommand, TFDMetaInfoQuery und IFDPhysMetaInfoCommand zurückgegeben werden, haben Unicode-String-Datentypen.

Ablaufverfolgungsausgabe

Setzen Sie den Wert der Eigenschaft TADMoniFlatFileClientLink.FileEncoding auf ecUTF8 oder ecUTF16, um die Unicode-Codierung für die Ablaufverfolgungsausgabe (MonitorBy=FlatFile) zu aktivieren.

Tools

Alle FireDAC-Hilfsprogramme wurden mit der Unicode-Delphi-Version compiliert und sind 100 % Unicode-aktiviert.