Support Unicode (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des connexions (FireDAC)


Cette rubrique explique le fonctionnement de FireDAC avec les données et métadonnées Unicode. FireDAC prend entièrement en charge les données et métadonnées Unicode. Cependant, une application peut nécessiter des étapes supplémentaires avant d'utiliser Unicode de manière appropriée.

Informations générales

La plupart des applications de bases de données d'entreprise doivent être capables de fonctionner avec des données caractères codées fournies au format Unicode. FireDAC fournit une prise en charge transparente pour :

  • Les différents jeux de caractères client mono-octets et pages de codes, notamment les caractères ANSI standard.
  • Les chaînes multi-octets, telles que Unicode, notamment les codages UTF8, UTF16 et UCS2.

La gestion d'Unicode par FireDAC dépend des éléments suivants :

  • La version de Delphi utilisée.
  • Le jeu de caractères client - UTF8/UTF16 ou compatible ACP.
  • Le client / pilote du SGBD.

FireDAC effectue la conversion transparente du jeu de caractères entre l'application Delphi et le jeu de caractères client du SGBD, lorsque cela est requis. Notez que le support complet de Unicode est fourni uniquement si vous utilisez la version Unicode de Delphi (Delphi 2009 et ultérieure). Le tableau suivant présente l'emplacement et le type de codage utilisables en fonction de la version de Delphi :

Usage Delphi 2009 et supérieur compatible Unicode Delphi 2007 et inférieur non compatible Unicode
Texte de commande SQL Unicode ANSI
Texte de script SQL Unicode ANSI
Valeurs des champs de l'ensemble de résultats Unicode / ANSI ANSI / Unicode
Valeurs des paramètres Unicode / ANSI ANSI / Unicode
Valeurs des métadonnées, notamment :
  • noms de colonnes
  • noms de tables
  • noms de générateurs
  • noms d'index
  • et ainsi de suite.
Unicode ANSI
Valeurs des requêtes de métadonnées Unicode Unicode
Fichiers de données texte Unicode / ANSI ANSI / Unicode
Sortie de suivi Unicode / ANSI ANSI / Unicode
Outils Unicode Unicode

Configuration des définitions de connexion pour Unicode

Remarque : Il est recommandé de définir le jeu de caractères client du SGBD sur Unicode pour Delphi 2009 et ultérieur afin d'éviter les pertes de conversion.

En général, pour configurer les définitions de connexion pour Unicode, il est nécessaire de définir le jeu de caractères client du SGBD sur Unicode. La manière de procéder dépend de la version de Delphi et du pilote de SGBD utilisé :

SGBD Paramètre
Advantage Database Server Non pris en charge.
IBM DB2 Server Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.
Serveur DataSnap Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.
Firebird CharacterSet=utf8.
Informix Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur.
InterBase CharacterSet=utf8.
Microsoft SQL Server Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.
Base de données Microsoft Access Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.

Définir StringFormat=Unicode pour forcer toutes les colonnes chaîne à contenir des types de données Unicode.

Serveur MySQL CharacterSet=utf8.
Serveur Oracle
  • CharacterSet=utf8.
  • ou NLS_LANG=_.UTF8, si CharacterSet n'est pas spécifié.
PostgreSQL CharacterSet=utf8.
Base de données SQLite Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.

Définir StringFormat=Unicode pour forcer toutes les colonnes chaîne à contenir des types de données Unicode.

Sybase SQL Anywhere Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.
Base de données Teradata CharacterSet=utf8 ou CharacterSet=utf16.
Pilote de pont dbExpress Dépend du pilote dbExpress.
Pilote de pont ODBC Défini automatiquement sur UTF16 dans Delphi 2009 et ultérieur. Non supporté dans Delphi 2007 ou inférieur.

Texte de commande SQL

A partir de Delphi 2009, TFDQuery.SQL, TFDCommand.CommandText, IFDPhysCommand.CommandText et les autres valeurs de propriété sont codées au format Unicode. Le préprocesseur de texte de commande SQL supporte uniquement le codage UCS2, ce qui implique que les paires de substitution ne sont pas prises en charge.

Les versions antérieures à Delphi 2009 prennent uniquement en charge le texte de commande codé au format ANSI.

Avant d'envoyer un texte de commande SQL vers le SGBD, FireDAC le convertit en :

  • Page de code active, si le jeu de caractères client est mono-octet (non Unicode). Si le jeu de caractères client n'est pas compatible avec ACP, des pertes de conversion sont possibles.
  • UTF8, si le jeu de caractères client est UTF8.
  • UTF16, si le jeu de caractères client est UTF16.

Pour spécifier un texte de commande SQL codé au format Unicode, indiquez simplement ce qui suit :

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

Texte de script SQL

A partir de Delphi 2009, les collections TFDScript.SQLScripts peuvent contenir des textes de script SQL codés au format Unicode. Sinon, le traitement du texte de script SQL est similaire au traitement du texte de commande SQL.

Les versions antérieures à Delphi 2009 prennent uniquement en charge le texte de script codé au format ANSI. TFDScript peut charger les fichiers de script SQL codés au format Unicode, mais ils seront convertis en codage ACP (ANSI) avant le traitement.

Pour contrôler le codage du fichier de script SQL et du fichier journal, utilisez la propriété TFDScript.ScriptOptions.FileEncoding :

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

Champs de l'ensemble de résultats

SGBD Description
Advantage Database Server
  • NCHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • NVARCHAR - ftWideString
  • NMEMO - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
IBM DB2 Server
  • GRAPHIC - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARGRAPHIC - ftWideString
  • LONG VARGRAPHIC, DBCLOB - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Serveur DataSnap
  • ftFixedWideChar sur Delphi 2006 et ultérieur et ftWideString
  • ftWideMemo sur Delphi 2006 et ultérieur, et ftFmtMemo
Firebird Si CharacterSet est UTF8 ou UNICODE_FSS, alors :
  • CHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARCHAR - ftWideString
  • BLOB SUB_TYPE TEXT - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Informix

Si le paramètre de définition de la connexion StringFormat=Unicode, alors toutes les colonnes chaîne comportent des chaînes étendues. Si StringFormat=Ansi, alors toutes les colonnes chaîne comportent des chaînes ANSI. Par défaut, StringFormat=Ansi.

InterBase Si CharacterSet est UTF8 UNICODE_FSS, UNICODE_LE ou UNICODE_BE, alors :
  • CHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARCHAR - ftWideString
  • BLOB SUB_TYPE TEXT - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Microsoft SQL Server
  • NCHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • NVARCHAR - ftWideString
  • NTEXT, NVARCHAR(MAX) - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Base de données Microsoft Access
  • CHARACTER - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • MEMO - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo

Si le paramètre de définition de la connexion StringFormat=Unicode, alors toutes les colonnes chaîne comportent des chaînes étendues. Si StringFormat=Ansi, alors toutes les colonnes chaîne comportent des chaînes ANSI. Par défaut, StringFormat=Choose.

Serveur MySQL Si CharacterSet est UTF8, alors :
  • CHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARCHAR, TINYTEXT - ftWideString
  • MEDIUMTEXT, TEXT, LONGTEXT- ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Serveur Oracle
  • NCHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • NVARCHAR2 - ftWideString
  • NCLOB - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo

Si CharacterSet est UTF8, alors :

  • CHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARCHAR2 - ftWideString
  • LONG, CLOB - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Base de données SQLite Si StringFormat=Choose, alors :
  • NCHAR, NATIONAL CHAR, NATIONAL CHARACTER - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • NVARCHAR, NVARCHAR2, NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING - ftWideString
  • TEXT, NTEXT, WTEXT, NCLOB, NMEMO, LONG NTEXT, LONG WTEXT, NATIONAL TEXT, LONGWVARCHAR - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo

Si le paramètre de définition de la connexion StringFormat=Unicode, alors toutes les colonnes chaîne comportent des chaînes étendues. Si StringFormat=Ansi, alors toutes les colonnes chaîne comportent des chaînes ANSI. Par défaut, StringFormat=Choose.

PostgreSQL Si CharacterSet est UTF8, alors :
  • CHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • VARCHAR - ftWideString
  • TEXT - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Sybase SQL Anywhere
  • NCHAR - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • NVARCHAR - ftWideString
  • LONG NVARCHAR - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
Base de données Teradata Non pris en charge.
Pilote de pont dbExpress Dépend du pilote dbExpress et du SGBD. Règle générale :

DBX1-3 :

  • fldZSTRING, fldstUNICODE - ftWideString
  • fldZSTRING, fldstUNICODE, fldstFIXED - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • fldBLOB, fldstMEMO, fldstUNICODE - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo
  • fldBLOB, fldstFMTMEMO - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo

DBX4 :

  • TDBXDataTypes.WideStringType - ftWideString
  • TDBXDataTypes.WideStringType, TDBXDataTypes.FixedSubType - ftFixedWideChar
  • TDBXDataTypes.BlobType, TDBXDataTypes.WideMemoSubType - ftWideMemo
Pilote de pont ODBC Dépend du pilote ODBC et du SGBD. Règle générale :
  • SQL_WCHAR, SQL_GRAPHIC - ftFixedWideChar sur Delphi 2006 et ultérieur, sinon ftWideString
  • SQL_WVARCHAR, SQL_VARGRAPHIC, SQL_LONGVARGRAPHIC - ftWideString
  • SQL_WLONGVARCHAR, SQL_DBCLOB - ftWideMemo sur Delphi 2006 et ultérieur, sinon ftFmtMemo

Pour lire/écrire les valeurs des chaînes Unicode par programme, utilisez :

  • Les propriétés TField.AsWideString ou TField.Value.
  • TField.AsString sur Delphi 2009 et ultérieur. Sur les versions antérieures de Delphi, la lecture/l'écriture de la propriété AsString peut entraîner des pertes de conversion, parce que AsString retourne des chaînes ANSI.

Pour lire/écrire le champ Unicode sur n'importe quelle version de Delphi :

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

Pour lire/écrire le champ mémo Unicode sur Delphi 2009 :

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

Valeurs des paramètres

La valeur de paramètre codée au format Unicode est convertie en jeu de caractères Unicode supporté par le SGBD, puis envoyée vers le SGBD. Cela ne dépend pas d'un jeu de caractères client ou d'une version de Delphi. Notez que Firebird et InterBase ne peuvent pas envoyer de données caractères Unicode vers un serveur si le paramètre CharacterSet n'est pas UTF8.

Pour lire/écrire une valeur de paramètre Unicode sur n'importe quelle version de Delphi, utilisez la propriété AsWideString. Le comportement de AsString dépend de la plate-forme :

  • Sur les plates-formes NextGen (iOS et Android), AsString est équivalent à AsWideString (Unicode).
  • Sur les autres plates-formes, AsString est équivalent à AsAnsiString (chaînes de jeux de caractères mono-octets / ANSI).

Par exemple:

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

Valeurs des métadonnées

A partir de Delphi 2009, le texte des métadonnées codé au format Unicode est pris en charge pour :

  • les noms des tables,
  • les noms des colonnes de l'ensemble de résultats,
  • les noms des procédures stockées,
  • les noms des paramètres des procédures stockées,
  • les noms des paramètres de commande SQL,
  • les noms des macros de commande SQL,
  • le nom de l'utilisateur,
  • les noms des schémas, catalogues.

Les versions antérieures à Delphi 2009 supportent uniquement le texte de métadonnées codé au format ANSI.

Toutes les colonnes de métadonnées des jeux de résultats retournés par TFDMetaInfoCommand, TFDMetaInfoQuery et IFDPhysMetaInfoCommand sont des types de données chaîne Unicode.

Sortie de suivi

Pour activer le codage Unicode pour la sortie du fichier de suivi (MonitorBy=FlatFile), définissez la valeur de la propriété TADMoniFlatFileClientLink.FileEncoding sur ecUTF8 ou ecUTF16.

Outils

Tous les utilitaires FireDAC sont compilés avec la version Unicode de Delphi et sont 100 % compatibles Unicode.