Funktionsgruppe: Zeichenkettenfunktion
Die Codierung eines Zeichens in Unicode ist nicht eindeutig, d.h. es kann für ein Zeichen mehr als eine Codierung geben, siehe „ Basishandbuch“.
Ein typisches Beispiel sind die deutschen Umlaute. Beispielsweise hat das Zeichen Ä sowohl den Code Point U+00C4
(composed form) als auch die Code Point-Kombination U+0041
und U+0308
(decomposed form). In normalisierten Darstellungsformen treten diese Unterschiede nicht auf. Wenn zwei normalisierte Zeichenketten unterschiedlich sind, dann sind es auch ihre unterschiedlichen Code Point-Darstellungen.
NORMALIZE() bringt eine National-Zeichenkette mit National-Zeichen, die Code Points im Bereich U+0000
bis U+2FFF
besitzen, in eine normalisierte Form. Andere Zeichen, z.B. Surrogates, bleiben unverändert.
NORMALIZE (
ausdruck [,{ NFC | NFD } [,
länge ]])
länge ::=
vorzeichenlose_ganzzahl
ausdruck
National-Ausdruck. Seine Auswertung ergibt eine National-Zeichenkette (Datentyp NCHAR oder NVARCHAR) in normalisierter Form.
ausdruck darf kein multipler Wert mit Dimension > 1 sein.
NFC | NFD
Normalisierungsformen C („Canonical Decomposition followed by Canonical Composition“) bzw. D („Canonical Decomposition“) des Unicode-Standards.
NFC bildet alle Code Points, die zusammen ein Zeichen ergeben, in den entsprechenden Code Point ab. NFD zerlegt jedes „zusammengesetzte“ Zeichen in seine einzelnen Bestandteile, in das Grundzeichen und in die damit verknüpften diakritischen Zeichen. Die Reihenfolge der verknüpften diakritischen Zeichen ist dabei streng festgelegt.
länge
Maximale Länge der normalisierten Darstellung in Code Units.
Länge nicht angegeben:
Das Ergebnis kann abhängig von ausdruck bis zu 16000 Code Units lang werden.
Ergebnis
Wenn der Wert von ausdruck der NULL-Wert ist, dann ist das Ergebnis der NULL-Wert.
Sonst:
Die normalisierte Darstellung des Wertes von ausdruck.
Es gilt: Länge der normalisierten Darstellung (NFC) <= Länge der nicht normalisierten Darstellung <= Länge der normalisierte Darstellung (NFD).
Wenn die Länge der normalisierten Darstellung größer ist als die angegebene länge, dann wird die Funktion mit SQLSTATE abgebrochen.
Datentyp: NVARCHAR( MIN(2*
n,16000) ),
wobei n die Länge des Argumentdatentyps NCHAR(n) bzw. NVARCHAR(n) ist.Auch für ein Argument vom Typ NCHAR ist der Datentyp NVARCHAR.
Beispiel
Folgende Suchbedingung normalisiert einen Benutzernamen, um unerwünschte Benutzer, die sich in unterschiedlichen Darstellungsformen anmelden, zu erkennen.
... WHERE NORMALIZE(:kunde,NFC)
NOT IN (SELECT name FROM unerwünschte_kunden)