Unicode-Unterstützung (FireDAC)
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.
Inhaltsverzeichnis
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:
|
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 |
|
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 |
|
IBM DB2 Server |
|
DataSnap-Server |
|
Firebird | Wenn CharacterSet auf UTF8 oder UNICODE_FSS gesetzt ist, dann:
|
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:
|
Microsoft SQL Server |
|
Microsoft Access-Datenbank |
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:
|
Oracle Server |
Wenn CharacterSet auf UTF8 gesetzt ist, dann:
|
SQLite-Datenbank | Wenn StringFormat=Choose, dann:
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:
|
Sybase SQL Anywhere |
|
Teradata Database | Nicht unterstützt. |
dbExpress-Brückentreiber | Hängt vom dbExpress-Treiber und dem DBMS ab. Allgemeine Regel:
DBX1-3:
DBX4:
|
ODBC-Brückentreiber | Hängt vom ODBC-Treiber und dem DBMS ab. Allgemeine Regel:
|
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 zuAsWideString
(Unicode). - Auf anderen Plattformen ist
AsString
äquivalent zuAsAnsiString
(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.