Programmation côté serveur avec Unicode

La création d'une base de données prenant en charge Unicode exige la définition d'interactions clientes compatibles Unicode en plus de l'utilisation des types de données nchar, nvarchar et nvarchar(max) pour définir le stockage Unicode. Vous pouvez définir des interactions clientes compatibles Unicode en exécutant les opérations suivantes sur la base de données côté serveur :

  • convertir des types de données non-Unicode en types de données Unicode dans les colonnes de table ainsi que dans des opérations CONVERT() et CAST() ;

  • remplacer les fonctions ASCII() et CHAR() par leurs équivalents Unicode : UNICODE() et NCHAR() ;

  • définir les variables et paramètres des procédures stockées et des déclencheurs au format Unicode ;

  • ajouter la lettre N devant les constantes de chaînes de caractères Unicode.

Utilisation de UNICODE(), NCHAR() et d'autres fonctions

La fonction ASCII() retourne le code non-Unicode du caractère transmis. Par conséquent, utilisez l'équivalent de la fonction UNICODE() pour les chaînes Unicode dans lesquelles vous utiliseriez la fonction ASCII pour des chaînes non-Unicode. La même remarque s'applique à la fonction CHAR ; NCHAR est son équivalent Unicode.

Comme la fonction SOUNDEX() est définie selon des règles phonétiques anglaises, elle n'est pas significative dans des chaînes Unicode, à moins que la chaîne contienne uniquement les caractères latins de A à Z et de a à z.

Des paramètres Unicode peuvent être passés aux fonctions ASCII, CHAR et SOUNDEX, mais ces arguments sont implicitement convertis en chaînes non-Unicode. Cela peut entraîner une perte éventuelle de caractères Unicode avant le traitement, car ces fonctions agissent par définition sur des chaînes non-Unicode.

Outre les fonctions UNICODE() et NCHAR(), les fonctions de manipulation de chaînes suivantes prennent en charge Unicode dans la mesure du possible : CHARINDEX(), LEFT(), LEN(), UPPER(), LOWER(), LTRIM(), RTRIM(), PATINDEX(), REPLACE(), QUOTENAME(), REPLICATE(), REVERSE(), STUFF(), SUBSTRING(), UNICODE(). Ces fonctions acceptent les arguments Unicode, respectent la limite de caractères de 2 octets des chaînes Unicode et utilisent les règles de tri Unicode pour les comparaisons de chaînes lorsque les paramètres d'entrée sont au format Unicode.

Définition des paramètres dans les procédures stockées

La définition des paramètres avec un type de données Unicode garantit la conversion implicite au format Unicode des demandes ou entrées clientes sur le serveur et l'absence d'altération en cours de processus. Si le paramètre est spécifié en tant que paramètre OUTPUT, un type Unicode minimise également le risque d'altération lors de son retour au client.

Dans la procédure stockée suivante, la variable est déclarée en tant que type de données Unicode.

CREATE PROCEDURE Product_Info
    @name nvarchar(40)
AS
SELECT p.ListPrice, v.Name
    FROM Production.Product p 
        INNER JOIN Purchasing.ProductVendor pv
            ON p.ProductID = pv.ProductID  
        INNER JOIN Purchasing.Vendor v
            ON pv.VendorID = v.VendorID
WHERE p.Name = @name;

Utilisation du préfixe N

Les constantes de chaînes Unicode qui s'affichent dans du code exécuté sur le serveur, par exemple dans des procédures stockées et des déclencheurs, doivent être précédées de la lettre N majuscule. Ceci s'applique même si la colonne référencée est déjà définie au format Unicode. Sans le préfixe N, la chaîne est convertie en page de codes par défaut de la base de données. Certains caractères risquent de ne pas être reconnus.

Par exemple, la procédure stockée créée dans l'exemple précédent peut être exécutée sur le serveur de la manière suivante :

EXECUTE Product_Info @name = N'Chain'

L'exigence d'utilisation du préfixe N s'applique à la fois aux contraintes de chaînes provenant du serveur et à celles envoyées par le client.