Serverseitige Programmierung mit Unicode

Um eine Datenbank Unicode-kompatibel zu machen, müssen Unicode-kompatible Clientinteraktionen definiert und die Datentypen nchar, nvarchar und nvarchar(max) für das Definieren der Unicode-Speicherung verwendet werden. Sie können Unicode-kompatible Clientinteraktionen definieren, indem Sie folgende Schritte am Datenbankserver ausführen:

  • Wechseln Sie in Tabellenspalten und in CONVERT()- und CAST()-Vorgängen von Nicht-Unicode-Datentypen zu Unicode-Datentypen.

  • Verwenden Sie anstelle von ASCII()- und CHAR()-Funktionen deren Unicode-Äquivalente UNICODE() und NCHAR().

  • Definieren Sie Variablen und Parameter gespeicherter Prozeduren und Trigger in Unicode.

  • Stellen Sie Unicode-Zeichenfolgenkonstanten den Buchstaben N voran.

Verwenden von UNICODE(), NCHAR() und weiteren Funktionen

Die ASCII()-Funktion gibt den Nicht-Unicode-Zeichencode des übergebenen Zeichens zurück. Aus diesem Grund sollten Sie die entsprechende UNICODE()-Funktion für Unicode-Zeichenfolgen verwenden, für die Sie die ASCII-Funktion bei Nicht-Unicode-Zeichenfolgen verwenden würden. Dasselbe gilt für die CHAR-Funktion; NCHAR ist die Unicode-Entsprechung.

Da die SOUNDEX()-Funktion basierend auf phonetischen Regeln in englischer Sprache definiert ist, ist sie bei Unicode-Zeichenfolgen nicht aussagekräftig, es sei denn die Zeichenfolge enthält nur die lateinischen Zeichen A bis Z und a bis z.

Unicode-Parameter können an ASCII, CHAR und SOUNDEX übergeben werden, diese Argumente werden jedoch implizit in Nicht-Unicode-Zeichenfolgen konvertiert. Dies kann zum Verlust von Unicode-Zeichen vor der Verarbeitung führen, da diese Funktionen definitionsgemäß für Nicht-Unicode-Zeichenfolgen ausgeführt werden.

Außer den Funktionen UNICODE() und NCHAR() unterstützen die folgenden Zeichenfolgenbearbeitungsfunktionen Unicode so weit wie irgend möglich: CHARINDEX(), LEFT(), LEN(), UPPER(), LOWER(), LTRIM(), RTRIM(), PATINDEX(), REPLACE(), QUOTENAME(), REPLICATE(), REVERSE(), STUFF(), SUBSTRING(), UNICODE(). Diese Funktionen akzeptieren Unicode-Argumente, sie respektieren Zeichengrenzwerte von 2 Byte für Unicode-Zeichenfolgen und verwenden Unicode-Sortierregeln für Zeichenfolgenvergleiche, wenn Unicode-Eingabeparameter verwendet werden.

Definieren von Parametern in gespeicherten Prozeduren

Durch das Definieren von Parametern mit einem Unicode-Datentyp wird sichergestellt, dass Clientanforderungen oder -eingaben implizit auf dem Server in Unicode konvertiert und nicht während des Prozesses beschädigt werden. Falls der Parameter als OUTPUT-Parameter angegeben ist, reduziert der Unicode-Typ zudem das Risiko einer Beschädigung auf dem Rückweg zum Client.

In der folgenden gespeicherten Prozedur wird die Variable als Unicode-Datentyp deklariert.

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;

Verwenden des Präfixes N

Unicode-Zeichenfolgenkonstanten, die in auf dem Server ausgeführtem Code angezeigt werden (z. B. in gespeicherten Prozeduren und Triggern) müssen den groß geschriebenen Buchstaben N als Präfix erhalten. Dies gilt auch, falls die Spalte, auf die verwiesen wird, bereits als Unicode definiert ist. Ohne das Präfix N, wird die Zeichenfolge in die Standardcodepage der Datenbank konvertiert. Hierbei werden möglicherweise bestimmte Zeichen nicht erkannt.

Die gespeicherte Prozedur, die beispielsweise im vorherigen Beispiel erstellt wurde, kann auf folgende Weise auf dem Server ausgeführt werden:

EXECUTE Product_Info @name = N'Chain'

Die Anforderung, das Präfix N zu verwenden, gilt sowohl für Zeichenfolgenkonstanten, die vom Server stammen, als auch für vom Client gesendete Zeichenfolgenkonstanten.