Zeichenfolgen

Eine Zeichenfolge ist eine Folge von Codeeinheiten. Die Länge der Zeichenfolge ist die Anzahl der Codeeinheiten in der Sequenz. Wenn die Länge null ist, wird der Wert als leere Zeichenfolgebezeichnet, die nicht mit dem Nullwert verwechselt werden darf.

Zeichenfolge fester Länge (CHAR)

Alle Werte in einer Zeichenfolgespalte mit fester Länge haben dieselbe Länge, die durch das Längenattribut der Spalte bestimmt wird. Das Längenattribut muss im Bereich von 1 bis 255 einschließlich liegen , es sei denn, die Zeichenfolgeeinheit ist CODEUNITS32, die einen Bereich von 1 bis 63 einschließlich hat.

Zeichenfolgen mit variabler Länge

Es gibt zwei Typen von Zeichenfolgen variabler Länge:
VARCHAR
Ein VARCHAR-Wert kann bis zu 32.672 Byte lang sein. Wenn die Zeichenfolgeeinheit CODEUNITS32ist, kann die Länge bis zu 8.168 Zeichenfolgeeinheiten betragen.
CLOB
Ein Zeichenwert eines großen Objekts (CLOB) kann bis zu 2 Gigabyte minus 1 Byte (2.147.483.647 Byte) lang sein oder, wenn die Zeichenfolgeeinheit CODEUNITS32ist, bis zu 536.870.911 Zeichenfolgeeinheiten. Ein CLOB wird zum Speichern großer SBCS-oder gemischter (SBCS und MBCS) zeichenbasierter Daten (z. B. Dokumente, die mit einem einzelnen Zeichensatz geschrieben wurden) verwendet und verfügt daher über eine zugeordnete SBCS-oder gemischte Codepage.
Besondere Einschränkungen gelten für Ausdrücke , die zu einem CLOB-Datentyp führen, und für Spalten strukturierter Typen. Solche Ausdrücke und Spalten sind in folgenden Fällen nicht zulässig:
  • Eine SELECT-Liste, der die Klausel DISTINCT vorangestellt ist
  • In der Klausel GROUP BY
  • In der Klausel ORDER BY
  • Eine Unterauswahl eines anderen Gruppenoperators als UNION ALL
  • Ein Basis-, Quantified-, BETWEEN-oder IN-Prädikat
  • Eine Aggregatfunktion
  • VARGRAPHIC-, TRANSLATE-und datetime-Skalarfunktionen
  • Der Musteroperand in einem Prädikat LIKE oder der Suchzeichenfolgeoperand in einer POSSTR-Funktion
  • Die Zeichenfolgedarstellung eines Datums-/Uhrzeitwerts.

Die Funktionen im SYSFUN-Schema, die einen VARCHAR als Argument verwenden, akzeptieren keine VARCHARs mit mehr als 4.000 Byte als Argument. Viele dieser Funktionen haben jedoch auch eine alternative Signatur, die ein CLOB (1M) akzeptiert. Für diese Funktionen kann der Benutzer die mehr als 4.000 VARCHAR-Zeichenfolgen explizit in CLOBs umsetzen und dann das Ergebnis wieder in VARCHARs mit der erforderlichen Länge umwandeln.

NUL-terminierte Zeichenfolgen, die in C gefunden werden, werden abhängig von der Standardstufe der Vorkompilierungsoption unterschiedlich behandelt.

Jede Zeichenfolge wird weiter definiert als eine der folgenden Zeichenfolgen:
BIT DATA
Daten, die keiner Codepage zugeordnet sind.
SBCS-Daten (Einzelbytezeichensatz)
Daten, bei denen jedes Zeichen durch ein Byte dargestellt wird.
Gemischte Daten
Daten, die eine Mischung aus Zeichen aus einem Einzelbytezeichensatz und einem Mehrbytezeichensatz (MBCS) enthalten können
Hinweis: Der Datentyp LONG VARCHAR wird weiterhin unterstützt, ist jedoch veraltet, wird nicht empfohlen und wird möglicherweise in einem zukünftigen Release entfernt.

Spezifikation von Zeichenfolgeeinheiten für Zeichenfolgen

Die Längeneinheit für den Zeichenfolgedatentyp ist OCTETS oder CODEUNITS32. Die Längeneinheit definiert die Zählmethode, mit der die Länge der Daten bestimmt wird.
OCTETS
Gibt an, dass es sich bei den Einheiten für das Längenattribut um Bytes handelt. Diese Längeneinheit gilt für alle Zeichenfolgedatentypen in einer Nicht-Unicode-Datenbank. In einer Unicode-Datenbank kann OCTETS explizit angegeben oder basierend auf einer Umgebungseinstellung bestimmt werden.
CODEUNITS32
Gibt an, dass es sich bei den Einheiten für das Längenattribut um Codeeinheiten von Unicode UTF-32 handelt, was der Zählweise in Zeichen ungefähr entspricht. Diese Längeneinheit wirkt sich nicht auf die dem Datentyp zugrundeliegende Codepage aus. Die tatsächliche Länge des Datenwerts wird bestimmt, indem die UTF-32-Codeeinheitein quantitativ erfasst werden, als ob Daten in UTF-32 konvertiert werden würden. Die Zeichenfolgeeinheit CODEUNITS32 kann nur in einer Unicode-Datenbank verwendet werden. CODEUNITS32 kann explizit angegeben oder basierend auf einer Umgebungseinstellung bestimmt werden.

In einer Nicht-Unicode-Datenbank ist die Zeichenfolgeeinheit immer OCTETS und kann nicht geändert werden. In einer Unicode-Datenbank können die Zeichenfolgeeinheiten explizit mit dem Längenattribut eines Zeichenfolgedatentyps oder auf der Basis einer Umgebungseinstellung angegeben werden. Wenn FOR BIT DATA auch für den Zeichenfolgedatentyp angegeben ist, kann CODEUNITS32 nicht angegeben werden und die Umgebungseinstellung CODEUNITS32 gilt nicht.

Die Umgebungseinstellung für Zeichenfolgeeinheiten basiert auf dem Wert für die globale Variable NLS_STRING_UNITS oder auf dem Datenbankkonfigurationsparameter string_units . Der Datenbankkonfigurationsparameter kann auf SYSTEM oder CODEUNITS32gesetzt werden. Die globale Variable kann auch auf SYSTEM oder CODEUNITS32gesetzt werden, aber auch auf NULL. Der Wert NULL gibt an, dass die SQL-Sitzung die Einstellung des Datenbankkonfigurationsparameters string_units verwenden soll. Wenn der Wert für die Umgebungseinstellung SYSTEM lautet, wird OCTETS als Standardeinstellung für Zeichenfolgeeinheiten verwendet.

Zeichenfolgeeinheiten in integrierten Funktionen

Die Möglichkeit, Zeichenfolgeeinheiten für bestimmte integrierte Zeichenfolgefunktionen anzugeben, ermöglicht es Ihnen, Zeichenfolgedaten "zeichenfolgebasierter" als "bytebasiert" zu verarbeiten. Die Zeichenfolgeeinheit bestimmt die Einheit, die beim Ausführen der Funktion für die Länge oder Position verwendet wird. Sie können CODEUNITS16, CODEUNITS32oder OCTETS als Zeichenfolgeeinheit für einige Zeichenfolgefunktionen angeben. Wenn keine Zeichenfolgeeinheit angegeben wird, wird die Standardzeichenfolgeeinheit normalerweise durch die Zeichenfolgeeinheiten des Quellenzeichenfolgearguments bestimmt (Details finden Sie in der Beschreibung der Funktion, die Sie verwenden). Das Argument für Zeichenfolgeeinheiten kann für Zeichenfolgefunktionen angegeben werden, die den Parameter in Unicode-oder Nicht-Unicode-Datenbanken unterstützen.

CODEUNITS16
Gibt an, dass Unicode UTF-16 die Einheit für die Operation ist. CODEUNITS16 ist nützlich, wenn eine Anwendung Daten in Codeeinheiten mit einer Breite von 2 Byte verarbeitet. Beachten Sie, dass für einige Zeichen, die als ergänzende Zeichenbezeichnet werden, zwei UTF-16 -Codeeinheiten codiert werden müssen. Das musikalische Symbol G clef erfordert beispielsweise zwei UTF-16 -Codeeinheiten (X'D834' und X'DD1E' in UTF-16BE).
CODEUNITS32
Gibt an, dass Unicode UTF-32 die Einheit für die Operation ist. CODEUNITS32 ist nützlich für Anwendungen, die Daten in einem einfachen Format fester Länge verarbeiten und unabhängig vom Speicherformat der Daten (ASCII, UTF-8oder UTF-16) dieselbe Antwort zurückgeben müssen.
Hinweis: Der Speicher auf Platte verwendet die Codierung UTF-8 .
OCTETS
Gibt an, dass Byte die Einheiten für die Operation sind. OCTETS wird häufig verwendet, wenn eine Anwendung an der Zuordnung von Pufferspeicher interessiert ist oder wenn Operationen einfache Byteverarbeitung verwenden müssen.

Die berechnete Länge einer mit OCTETS (Byte) berechneten Zeichenfolge kann von der mit CODEUNITS16 oder CODEUNITS32berechneten Länge abweichen. Wenn Sie OCTETS verwenden, wird die Länge der Zeichenfolge durch einfaches Zählen der Anzahl Byte in der Zeichenfolge bestimmt. Wenn Sie CODEUNITS16 oder CODEUNITS32verwenden, wird die Länge der Zeichenfolge ermittelt, indem die Anzahl der 16 -Bit-oder 32-Bit-Codeeinheiten gezählt wird, die zur Darstellung der Zeichenfolge in UTF-16 oder UTF-32erforderlich sind. Eine mit CODEUNITS16 und CODEUNITS32 festgelegte Länge ist identisch, es sei denn, die Daten enthalten zusätzliche Zeichen (siehe Unterschied zwischen CODEUNITS16 und CODEUNITS32).

Angenommen, NAME, eine Spalte des Typs VARCHAR (128), die in Unicode UTF-8codiert ist, enthält den Wert 'Jürgen'. Die folgenden beiden Abfragen, die die Länge der Zeichenfolge in CODEUNITS16 oder CODEUNITS32zählen, geben denselben Wert zurück.
   SELECT CHARACTER_LENGTH(NAME,CODEUNITS16) FROM T1
     WHERE NAME = 'Jürgen'

   SELECT CHARACTER_LENGTH(NAME,CODEUNITS32) FROM T1
     WHERE NAME = 'Jürgen'
Die nächste Abfrage, die die Länge der Zeichenfolge in OCTEts zählt, gibt den Wert 7 zurück.
   SELECT CHARACTER_LENGTH(NAME,OCTETS) FROM T1
     WHERE NAME = 'Jürgen'
Diese Werte stellen die Länge der Zeichenfolge dar, die in der angegebenen Zeichenfolgeeinheit ausgedrückt wird.
Die folgende Tabelle zeigt die Darstellungen UTF-8, UTF-16BE (big-endian)und UTF-32BE (big-endian) des Namens 'Jürgen':
Format    Representation of the name 'Jürgen'
--------  --------------------------------------
UTF-8	  X'4AC3BC7267656E'
UTF-16BE 	X'004A00FC007200670065006E'
UTF-32BE 	X'0000004A000000FC0000007200000067000000650000006E'
Die Darstellung des Zeichens 'ü' unterscheidet sich zwischen den drei Zeichenfolgeeinheiten:
  • Die UTF-8 -Darstellung des Zeichens 'ü' ist X'C3BC'.
  • Die UTF-16BE -Darstellung des Zeichens 'ü' ist X'00FC'.
  • Die UTF-32BE -Darstellung des Zeichens 'ü' ist X'000000FC'.

Die Angabe von Zeichenfolgeeinheiten für eine integrierte Funktion hat keine Auswirkungen auf den Datentyp, die Zeichenfolgeeinheiten oder die Codepage des Ergebnisses der Funktion. Bei Bedarf werden die Daten zur Auswertung in Unicode konvertiert, wenn CODEUNITS16 oder CODEUNITS32 angegeben wird.

Wenn OCTETS für die Funktion LOCATE oder POSITION angegeben wird und sich die Codepages der Zeichenfolgeargumente unterscheiden, werden die Daten in die Codepage des Arguments Quellenzeichenfolge konvertiert. In diesem Fall ist das Ergebnis der Funktion in der Codepage des Arguments source-string . Wenn OCTETS für Funktionen angegeben wird, die ein einzelnes Zeichenfolgeargument verwenden, werden die Daten in der Codepage des Zeichenfolgearguments ausgewertet und das Ergebnis der Funktion ist in der Codepage des Zeichenfolgearguments.

Unterschied zwischen CODEUNITS16 und CODEUNITS32

Wenn CODEUNITS16 oder CODEUNITS32 angegeben ist, ist das Ergebnis dasselbe, es sei denn, die Daten enthalten zusätzliche Unicode-Zeichen. Dies liegt daran, dass ein ergänzendes Zeichen durch zwei UTF-16 -Codeeinheiten oder eine UTF-32 -Codeeinheit dargestellt wird. In UTF-8wird ein nicht ergänzendes Zeichen durch 1 bis 3 Byte und ein ergänzendes Zeichen durch 4 Byte dargestellt. In UTF-16wird ein nicht ergänzendes Zeichen durch eine CODEUNITS16 -Codeeinheit oder 2 Byte und ein ergänzendes Zeichen durch zwei CODEUNITS16 -Codeeinheiten oder 4 Byte dargestellt. In UTF-32wird ein Zeichen durch eine CODEUNITS32 Codeeinheit oder 4 Byte dargestellt.

Die folgende Tabelle zeigt beispielsweise die Hexadezimalwerte für die mathematische Fettschrift A und den lateinischen Großbuchstaben A. Die mathematische Fettschrift A ist ein zusätzliches Zeichen, das durch 4 Byte in UTF-8, UTF-16und UTF-32dargestellt wird.
Zeichen UTF-8 -Darstellung UTF-16BE -Darstellung UTF-32BE -Darstellung
Unicode-Wert X'1D400' -'A'; mathematische Fettschrift A X'F09D9080' X'D835DC00' X'0001D400'
Unicode-Wert X'0041 ' -'A'; lateinischer Großbuchstabe A X'41' X'0041' X'00000041 '
Angenommen, C1 ist eine Spalte VARCHAR (128), die in Unicode UTF-8codiert ist, und die Tabelle T1 enthält eine Zeile mit dem Wert des mathematischen Fettkapitals A (X'F09D9080'). Die folgenden Abfragen geben unterschiedliche Ergebnisse zurück:
Query                                                Returns
-----                                                -------
SELECT CHARACTER_LENGTH(C1,CODEUNITS16) FROM T1      2

SELECT CHARACTER_LENGTH(C1,CODEUNITS32) FROM T1      1

SELECT CHARACTER_LENGTH(C1,OCTETS) FROM T1           4