Zuordnungen und Vergleiche
Die Basisoperationen von SQL sind Zuordnung und Vergleich.
Zuordnungsoperationen werden während der Ausführung von Anweisungen INSERT, UPDATE, FETCH, SELECT INTO, VALUES INTO und SET für Übergangsvariablen ausgeführt. Argumente von Funktionen werden auch beim Aufrufen einer Funktion zugeordnet. Vergleichsoperationen werden während der Ausführung von Anweisungen ausgeführt, die Vergleichselemente und andere Sprachelemente wie MAX, MIN, DISTINCT, GROUP BY und ORDER BY enthalten.
Eine Grundregel für beide Operationen ist, dass der Datentyp der beteiligten Operanden kompatibel sein muss. Die Kompatibilitätsregel gilt auch für Set-Operationen.
Eine weitere grundlegende Regel für Zuordnungsoperationen besteht darin, dass ein Nullwert weder einer Spalte zugeordnet werden kann, die keine Nullwerte enthalten kann, noch einer Hostvariablen, der keine Indikatorvariable zugeordnet ist.
Im Folgenden finden Sie eine Kompatibilitätsmatrix mit den integrierten Datentypkompatibilitäten für Zuordnungs-und Vergleichsoperationen.
| Operanden | Binäre Ganzzahl | Dezimal- zahl | Gleit- komma- zahl | Dezimale Gleitkommazahl | Zeichen- folge | Grafik- zeichen- folge | Binärzeichenfolge | Datum | Zeit | Zeit- marke | boolesch | UDT |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Binäre Ganzzahl | Yes | Yes | Yes | Yes | Ja | Ja 5 | Nein | Nein | Nein | Nein | Ja | 2 |
| Dezimal- zahl | Yes | Yes | Yes | Yes | Ja | Ja 5 | Nein | Nein | Nein | Nein | Nein | 2 |
| Gleitkomma | Yes | Yes | Yes | Yes | Ja | Ja 5 | Nein | Nein | Nein | Nein | Nein | 2 |
| Dezimale Gleit- komma- zahl | Yes | Yes | Yes | Yes | Ja | Ja 5 | Nein | Nein | Nein | Nein | Nein | 2 |
| Zeichen- folge | Ja | Ja | Ja | Ja | Yes | Ja 5,6 | Ja 3 | Ja | Ja | Ja | Ja | 2 |
| Grafik- zeichen- folge | Ja 5 | Ja 5 | Ja 5 | Ja 5 | Ja 5,6 | Yes | Nein | Ja 5 | Ja 5 | Ja 5 | Ja | 2 |
| Binärzeichenfolge | Nein | Nein | Nein | Nein | Ja 3 | Nein | Yes | Nein | Nein | Nein | Nein | 2 |
| Datum | Nein | Nein | Nein | Nein | Ja | Ja 5 | Nein | Yes | Nein | Ja | Nein | 2 |
| Zeit | Nein | Nein | Nein | Nein | Ja | Ja 5 | Nein | Nein | Yes | 1 | Nein | 2 |
| Zeitmarke | Nein | Nein | Nein | Nein | Ja | Ja 5 | Nein | Ja | 1 | Yes | Nein | 2 |
| boolesch | Ja | Nein | Nein | Nein | Ja | Ja | Nein | Nein | Nein | Nein | Ja | 2 |
| UDT | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | Yes |
1 Ein TIMESTAMP-Wert kann einem TIME-Wert zugeordnet werden. Ein TIME-Wert kann jedoch nicht einem TIMESTAMP-Wert zugeordnet werden und ein TIMESTAMP-Wert kann nicht mit einem TIME-Wert verglichen werden. 2 Ausführliche Informationen zu benutzerdefinierten Typen finden Sie unter Zuordnungen benutzerdefinierter Typen und Vergleiche benutzerdefinierter Typen. 3 Zeichenfolgen mit Ausnahme von Zeichenfolgen mit FOR BIT DATA sind nicht mit Binärzeichenfolgen kompatibel. FOR BIT DATA-Zeichenfolgen und binäre Zeichenfolgen werden als kompatibel betrachtet und alle Auffüllungen werden basierend auf dem Datentyp des Ziels ausgeführt. Wenn Sie beispielsweise einer binären Hostvariablen mit fester Länge einen FOR BIT DATA-Spaltenwert zuordnen, verwendet jede erforderliche Auffüllung ein Füllbyte von X'00 '. 4 Informationen zur Zuordnung und zum Vergleich von Referenztypen finden Sie unter Referenztypzuordnungen und Referenztypvergleiche. 5 Nur für Unicode-Datenbanken unterstützt. 6 Bitdaten und Grafikzeichenfolgen sind nicht kompatibel. |
||||||||||||
Numerische Zuordnungen
- Bei der Zuordnung zu einem exakten numerischen Datentyp tritt ein Überlauf auf, wenn eine Ziffer des gesamten Teils der Zahl eliminiert würde. Bei Bedarf wird der Bruchteil einer Zahl abgeschnitten.
- Bei der Zuordnung zu einem ungefähren numerischen Datentyp oder dezimalen Gleitkomma tritt ein Überlauf auf, wenn die signifikanteste Ziffer des gesamten Teils der Zahl eliminiert wird. Bei Gleitkommazahlen und dezimalen Gleitkommazahlen ist der gesamte Teil der Zahl die Zahl, die sich ergeben würde, wenn die Gleitkommazahl oder die dezimale Gleitkommazahl in eine Dezimalzahl mit unbegrenzter Genauigkeit konvertiert würde. Bei Bedarf kann das Runden dazu führen, dass die niedrigstwertigen Ziffern der Zahl eliminiert werden.
Bei dezimalen Gleitkommazahlen ist das Abschneiden des gesamten Teils der Zahl zulässig und führt zu einer Unendlichkeit mit einer Warnung.
Bei Gleitkommazahlen ist auch ein Unterlauf nicht zulässig. Ein Unterlauf tritt bei Zahlen zwischen 1 und -1 auf, wenn die höchstwertige Stelle, die nicht Null ist, eliminiert werden würde. Bei dezimalen Gleitkommazahlen ist ein Unterlauf zulässig und führt je nach Rundungsmodus zu null oder der kleinsten positiven Zahl oder der größten negativen Zahl, die zusammen mit einer Warnung dargestellt werden können.
Eine Überlauf-oder Unterlaufwarnung wird anstelle eines Fehlers zurückgegeben, wenn ein Überlauf oder Unterlauf bei der Zuordnung zu einer Hostvariablen mit einer Indikatorvariablen auftritt. In diesem Fall wird die Zahl nicht der Hostvariablen zugewiesen und die Indikatorvariable wird auf negativ 2 gesetzt.
Bei dezimalen Gleitkommazahlen gibt das Sonderregister CURRENT DECFLOAT ROUNDING MODE den aktuell gültigen Rundungsmodus an.
Zuordnungen zu Ganzzahl
Wenn eine Dezimal-, Gleitkomma-oder dezimale Gleitkommazahl einer ganzzahligen Spalte oder Variablen zugeordnet wird, wird der Bruchteil der Zahl eliminiert. Das Ergebnis ist, dass eine Zahl zwischen 1 und -1 auf 0 reduziert wird.
Zuordnungen zu Dezimalzahlen
Wenn eine ganze Zahl einer Dezimalspalte oder -variablen zugeordnet wird, wird die Zahl zuerst in eine temporäre Dezimalzahl konvertiert und dann, falls erforderlich, in die Genauigkeit und die Anzahl der Kommastellen des Ziels. Die Genauigkeit und der Maßstab der temporären Dezimalzahl beträgt 5,0 für eine kleine ganze Zahl, 11,0 für eine große ganze Zahl oder 19,0 für eine große ganze Zahl.
Wenn eine Dezimalzahl einer Dezimalspalte oder einer Dezimalvariablen zugeordnet wird, wird die Zahl bei Bedarf in die Genauigkeit und die Anzahl der Kommastellen des Ziels konvertiert. Die erforderliche Anzahl führender Nullen wird hinzugefügt und im Bruchteil der Dezimalzahl wird die erforderliche Anzahl abschließender Nullen hinzugefügt oder die erforderliche Anzahl abschließender Ziffern wird eliminiert.
Wenn eine Gleitkommazahl einer Dezimalspalte oder -variablen zugeordnet wird, wird die Zahl zuerst in eine temporäre Dezimalzahl mit der Genauigkeit 31 konvertiert und bei Bedarf auf die Genauigkeit und den Maßstab des Ziels abgeschnitten. Bei dieser Konvertierung wird die Zahl (mit Gleitkommaarithmetik) auf eine Genauigkeit von 31 Dezimalziffern gerundet. Dadurch wird eine Zahl zwischen 1 und -1, die kleiner als die kleinste positive Zahl oder größer als die größte negative Zahl ist, die in der Dezimalspalte oder der Variablen dargestellt werden kann, auf 0 reduziert. Die Skala erhält den größtmöglichen Wert, der die Darstellung des gesamten Teils der Zahl ohne Bedeutungsverlust ermöglicht.
Wenn eine dezimale Gleitkommazahl einer Dezimalspalte oder -variablen zugeordnet wird, wird die Zahl auf die Genauigkeit und den Maßstab der Dezimalspalte oder -variablen gerundet. Folglich wird eine Zahl zwischen 1 und -1, die kleiner als die kleinste positive Zahl oder größer als die größte negative Zahl ist, die in der Dezimalspalte oder -variablen dargestellt werden kann, auf 0 reduziert oder auf den kleinsten positiven oder größten negativen Wert gerundet, der in der Dezimalspalte oder -variablen dargestellt werden kann, je nach Rundungsmodus.
Zuordnungen zu Gleitkommazahlen
Gleitkommazahlen sind Näherungswerte für reelle Zahlen. Wenn also eine Ganzzahl, Dezimalzahl, Gleitkommazahl oder dezimale Gleitkommazahl einer Gleitkommaspalte oder -variablen zugeordnet wird, ist das Ergebnis möglicherweise nicht mit der ursprünglichen Zahl identisch. Die Zahl wird mit Hilfe der Gleitkommaarithmetik auf die Genauigkeit der Gleitkommaspalte oder -variablen gerundet. Ein dezimaler Gleitkommawert wird zuerst in eine Zeichenfolgedarstellung und dann in eine Gleitkommazahl konvertiert.
Zuordnungen zu dezimalen Gleitkommazahlen
Wenn eine ganze Zahl einer dezimalen Gleitkommaspalte oder -variablen zugeordnet wird, wird die Zahl zuerst in eine temporäre Dezimalzahl und dann in eine dezimale Gleitkommazahl konvertiert. Die Genauigkeit und der Maßstab der temporären Dezimalzahl beträgt 5,0 für eine kleine ganze Zahl, 11,0 für eine große ganze Zahl oder 19,0 für eine große ganze Zahl. Die Rundung kann auftreten, wenn ein BIGINT einer DECFLOAT (16) -Spalte oder -Variablen zugeordnet wird.
Wenn eine Dezimalzahl einer dezimalen Gleitkommaspalte oder -variablen zugewiesen wird, wird die Zahl in die Genauigkeit (16 oder 34) des Ziels konvertiert. Führende Nullen werden eliminiert. Abhängig von der Genauigkeit und dem Maßstab der Dezimalzahl und der Genauigkeit des Ziels kann der Wert gerundet werden.
Wenn eine Gleitkommazahl einer dezimalen Gleitkommaspalte oder -variablen zugeordnet wird, wird die Zahl zuerst in eine temporäre Zeichenfolgedarstellung der Gleitkommazahl konvertiert. Die Zeichenfolgedarstellung der Zahl wird dann in dezimale Gleitkommazahlen konvertiert.
Wenn eine DECFLOAT (16) -Zahl einer DECFLOAT (34) -Spalte oder -Variable zugewiesen wird, ist der resultierende Wert mit der DECFLOAT (16) -Zahl identisch.
Wenn eine DECFLOAT (34) -Zahl einer DECFLOAT (16) -Spalte oder -Variablen zugewiesen wird, wird der Exponent der Quelle in den entsprechenden Exponenten im Ergebnisformat konvertiert. Die Mantisse der Zahl DECFLOAT (34) wird auf die Genauigkeit des Ziels gerundet.
Zuordnungen von Zeichenfolgen zu numerischen Werten
Wenn eine Zeichenfolge einem numerischen Datentyp zugeordnet wird, wird sie mithilfe der Regeln für eine CAST-Spezifikation in den numerischen Zieldatentyp konvertiert.
Zeichenfolgezuweisungen
- In Speicherzuordnungwird ein Wert zugeordnet und das Abschneiden signifikanter Daten ist nicht wünschenswert, z. B. beim Zuordnen eines Werts zu einer Spalte.
- In Abrufzuordnungwird ein Wert zugewiesen und das Abschneiden ist zulässig, z. B. beim Abrufen von Daten aus der Datenbank.
Die Regeln für die Zeichenfolgezuordnung unterscheiden sich je nach Zuordnungstyp und Zeichenfolgetyp.
Zuordnungen binärer Zeichenfolgen
- Speicherzuordnung
- Die Länge einer Zeichenfolge, die einem binären Zeichenfolgeziel zugeordnet ist, darf nicht größer als das Längenattribut des Ziels sein. Wenn die Länge der Zeichenfolge größer als das Längenattribut des Ziels ist, können die folgenden Aktionen auftreten:
- Die Zeichenfolge wird mit abschließenden hexadezimalen Nullen (X'00 ') abgeschnitten (außer BLOB-Zeichenfolgen) zugeordnet, damit sie dem Längenattribut des Ziels entspricht.
- In den folgenden Abschneideszenarios wird ein Fehler (SQLSTATE 22001) zurückgegeben:
- Zeichen, die keine hexadezimale Null (X'00) sind, werden aus einer Binärzeichenfolge abgeschnitten, die keine BLOB-Zeichenfolge ist.
- Jedes Zeichen (oder Byte) wird aus einer BLOB-Zeichenfolge abgeschnitten.
Wenn die Zeichenfolge einem binären Ziel mit fester Länge zugeordnet wird und die Länge der Zeichenfolge kleiner als das Längenattribut des Ziels ist, wird die Zeichenfolge rechts mit der erforderlichen Anzahl hexadezimaler Nullen aufgefüllt.
- Abrufzuordnung
- Die Länge einer Zeichenfolge, die einem Ziel zugeordnet ist, kann das Längenattribut des Ziels überschreiten. Wenn eine Zeichenfolge einem Ziel zugeordnet wird und die Länge der Zeichenfolge das Längenattribut des Ziels überschreitet, wird die Zeichenfolge auf der rechten Seite um die erforderliche Anzahl Byte abgeschnitten. Wenn dieses Abschneiden auftritt, wird eine Warnung zurückgegeben (SQLSTATE 01004).
Wenn die Daten abgeschnitten werden, wenn sie einer Hostvariablen zugeordnet werden, wird der Wert 'W' dem Feld SQLWARN1 des SQL-Kommunikationsbereichs zugeordnet. Wenn eine Indikatorvariable bereitgestellt wird und die Quelle des Werts kein LOB ist, wird die Indikatorvariable auf die ursprüngliche Länge der Zeichenfolge gesetzt.
Wenn eine Zeichenfolge einem Ziel mit fester Länge zugeordnet wird und die Länge der Zeichenfolge kleiner als das Längenattribut des Ziels ist, wird die Zeichenfolge rechts mit der erforderlichen Anzahl hexadezimaler Nullen aufgefüllt.
Zuordnungen von Zeichen-und Grafikzeichenfolgen
- Speicherzuordnung
- Die Grundregel ist, dass die Länge der Zeichenfolge, die dem Ziel zugeordnet ist, nicht größer als das Längenattribut des Ziels sein darf. Wenn die Länge der Zeichenfolge größer als das Längenattribut des Ziels ist, können die folgenden Aktionen auftreten:
- Die Zeichenfolge wird mit abschließenden Leerzeichen zugeordnet, die abgeschnitten werden (von allen Zeichenfolgetypen außer LOB-Zeichenfolgen), damit sie dem Längenattribut des Ziels entspricht.
- In den folgenden Abschneideszenarios wird ein Fehler (SQLSTATE 22001) zurückgegeben:
- Nicht leere Zeichen würden aus anderen Zeichenfolgen als einer LOB-Zeichenfolge abgeschnitten
- Jedes Zeichen (oder Byte) würde aus einer LOB-Zeichenfolge abgeschnitten
In einer Unicode-Datenbank wird die Länge als die Anzahl der Codeeinheiten in den Zeichenfolgeeinheiten des Ziels definiert.- Wenn die Zielzeichenfolgeeinheiten OCTETS sind, darf die dem Ziel zugeordnete Zeichenfolge keine größere Bytelänge als das Ziel haben.
- Wenn die Zielzeichenfolgeeinheiten CODEUNITS16sind, darf die dem Ziel zugeordnete Zeichenfolge keine größere Anzahl von Unicode- UTF-16 -Codeeinheiten als das Längenattribut des Ziels aufweisen.
- Wenn die Zielzeichenfolgeeinheiten CODEUNITS32sind, darf die dem Ziel zugeordnete Zeichenfolge keine größere Anzahl von Unicode- UTF-32 -Codeeinheiten als das Längenattribut des Ziels haben.
Wenn eine Zeichenfolge einem Ziel mit fester Länge zugeordnet wird und die Länge der Zeichenfolge kleiner als das Längenattribut des Ziels ist, wird die Zeichenfolge rechts mit der erforderlichen Anzahl von Einzelbyte-, Doppelbyte-oder UCS-2 -Leerzeichen aufgefüllt. Das Füllzeichen ist immer ein Leerzeichen, auch für Spalten, die mit dem Attribut FOR BIT DATA definiert sind. (UCS-2 definiert mehrere SPACE-Zeichen mit unterschiedlichen Eigenschaften. Bei einer Unicode-Datenbank verwendet der Datenbankmanager immer ASCII SPACE an Position x '0020' als UCS-2 -Leerzeichen. Bei einer EUC-Datenbank wird der IDEOGRAPHIC SPACE an Position x '3000' zum Auffüllen von Grafikzeichenfolgen verwendet.)
- Abrufzuordnung
- Die Länge einer Zeichenfolge, die einem Ziel zugeordnet ist, kann das Längenattribut des Ziels überschreiten. Wenn eine Zeichenfolge einem Ziel zugeordnet wird und die Länge der Zeichenfolge das Längenattribut des Ziels überschreitet, wird die Zeichenfolge auf der rechten Seite um die erforderliche Anzahl von Zeichen (oder Bytes) abgeschnitten. Wenn dieses Abschneiden auftritt, wird eine Warnung zurückgegeben (SQLSTATE 01004).
Wenn die Daten abgeschnitten werden, wenn sie einer Hostvariablen zugeordnet werden, wird der Wert 'W' dem Feld SQLWARN1 des SQL-Kommunikationsbereichs zugeordnet. Wenn eine Indikatorvariable bereitgestellt wird und die Quelle des Werts kein LOB ist, wird die Indikatorvariable auf die ursprüngliche Länge der Zeichenfolge gesetzt.
Die Länge wird als Anzahl der Codeeinheiten in den Zeichenfolgeeinheiten des Ziels definiert.- Wenn die Zielzeichenfolgeeinheiten OCTETS sind und die Quellenzeichenfolge eine größere Bytelänge als das Ziel hat, wird die Zeichenfolge auf der rechten Seite um die erforderliche Anzahl Byte abgeschnitten.
- Wenn die Zielzeichenfolgeeinheiten CODEUNITS16 sind und die Quellenzeichenfolge eine größere Anzahl von Unicode- UTF-16 -Codeeinheiten als das Längenattribut des Ziels hat, wird die Zeichenfolge auf der rechten Seite durch die erforderliche Anzahl von Unicode- UTF-16 -Codeeinheiten abgeschnitten.
- Wenn die Zielzeichenfolgeeinheiten CODEUNITS32 sind und die Quellenzeichenfolge eine größere Anzahl von Unicode- UTF-32 -Codeeinheiten als das Längenattribut des Ziels hat, wird die Zeichenfolge auf der rechten Seite um die erforderliche Anzahl von Unicode- UTF-32 -Codeeinheiten abgeschnitten.
Wenn eine Zeichenfolge einem Ziel mit fester Länge zugeordnet wird und die Länge der Zeichenfolge kleiner ist als das Längenattribut des Ziels, wird die Zeichenfolge rechts mit der erforderlichen Anzahl von Einzelbyte-, Doppelbyte-oder UCS-2 -Leerzeichen aufgefüllt. Das Füllzeichen ist immer ein Leerzeichen, auch für Zeichenfolgen, die mit dem Attribut FOR BIT DATA definiert sind. (UCS-2 definiert mehrere SPACE-Zeichen mit unterschiedlichen Eigenschaften. Bei einer Unicode-Datenbank verwendet der Datenbankmanager immer ASCII SPACE an Position x '0020' als UCS-2 -Leerzeichen. Bei einer EUC-Datenbank wird der IDEOGRAPHIC SPACE an Position x '3000' zum Auffüllen von Grafikzeichenfolgen verwendet.)
Die Abrufzuordnung von C NUL-beendeten Hostvariablen wird auf der Basis von Optionen verarbeitet, die mit dem Befehl PREP oder BIND angegeben werden.
Konvertierungsregeln für Zeichenfolgezuweisungen
- Die Codepages sind unterschiedlich.
- Die Zeichenfolge ist weder null noch leer.
- Keine Zeichenfolge hat den Codepagewert 0 (FOR BIT DATA).
Bei Unicode-Datenbanken können Zeichenfolgen einer Grafikspalte und Grafikzeichenfolgen einer Zeichenspalte zugeordnet werden.
Hinweise zu MBCS für Zeichenfolgezuordnungen
- Das Auffüllen mit Leerzeichen erfolgt immer mit dem Einzelbytezeichen (X'20 ').
- Das Abschneiden von Leerzeichen erfolgt immer auf der Basis des Einzelbytezeichens (X'20 '). Das Doppelbytezeichen wird in Bezug auf das Abschneiden wie jedes andere Zeichen behandelt.
- Die Zuordnung einer Zeichenfolge zu einer Hostvariablen kann zu einer Fragmentierung von MBCS-Zeichen führen, wenn die Zielhostvariable nicht groß genug ist, um die gesamte Quellenzeichenfolge aufzunehmen. Wenn ein MBCS-Zeichen fragmentiert ist, wird jedes Byte des MBCS-Zeichenfragments im Ziel auf ein Einzelbyte-Leerzeichen (X'20 ') gesetzt, es werden keine weiteren Byte aus der Quelle versetzt, und SQLWARN1 wird auf' W ' gesetzt, um das Abschneiden anzugeben. Beachten Sie, dass dieselbe Handhabung von MBCS-Zeichenfragmenten auch dann gilt, wenn die Zeichenfolge als FOR BIT DATA definiert ist.
DBCS-Aspekte für Grafikzeichenfolgezuordnungen
Grafikzeichenfolgezuordnungen werden analog zu Zeichenfolgen verarbeitet. Bei Nicht-Unicode-Datenbanken sind Grafikzeichenfolgedatentypen nur mit anderen Grafikzeichenfolgedatentypen kompatibel und nie mit numerischen Datentypen, Zeichenfolgedatentypen oder Datentypen für Datum und Uhrzeit. Bei Unicode-Datenbanken sind Grafikzeichenfolgedatentypen mit Zeichenfolgedatentypen kompatibel. Die Datentypen Grafik und Zeichenfolge können jedoch nicht austauschbar in der Anweisung SELECT INTO oder VALUES INTO verwendet werden.
Wenn ein Grafikzeichenfolgewert einer Grafikzeichenfolgespalte zugeordnet wird, darf die Länge des Werts nicht größer als die Länge der Spalte sein.
Wenn ein Grafikzeichenfolgewert (die Zeichenfolge 'source') einem Grafikzeichenfolgedatentyp fester Länge (das 'Ziel ', das eine Spalte, eine Variable oder ein Parameter sein kann) zugeordnet wird und die Länge der Quellenzeichenfolge kleiner als die des Ziels ist, enthält das Ziel eine Kopie der Quellenzeichenfolge, die auf der rechten Seite mit der erforderlichen Anzahl von Doppelbyte-Leerzeichen aufgefüllt wurde, um einen Wert zu erstellen, dessen Länge der des Ziels entspricht.
Wird einer Grafikzeichenfolgehostvariablen ein Grafikzeichenfolgewert zugeordnet und ist die Länge der Quellenzeichenfolge größer als die Länge der Hostvariablen, enthält die Hostvariable eine Kopie der Quellenzeichenfolge, die auf der rechten Seite durch die erforderliche Anzahl von Doppelbytezeichen abgeschnitten wurde, um einen Wert zu erstellen, dessen Länge der der Hostvariablen entspricht. (Beachten Sie, dass sich das Abschneiden in diesem Szenario nicht mit der Halbierung eines Doppelbytezeichens befassen muss. Wenn eine Halbierung auftreten würde, wäre entweder der Quellenwert oder die Zielhostvariable ein falsch definierter Grafikzeichenfolgedatentyp.) Das Warnungsflag SQLWARN1 im SQLCA wird auf 'W' gesetzt. Die Bezugszahlvariable, falls angegeben, enthält die ursprüngliche Länge (in Doppelbytezeichen) der Quellenzeichenfolge. Im Fall von DBCLOB enthält die Indikatorvariable jedoch nicht die ursprüngliche Länge.
Die Abrufzuordnung von C NUL-terminierten Hostvariablen (deklariert mit wchar_t) basiert auf Optionen, die mit dem Befehl PREP oder BIND angegeben wurden.
Zuordnungen von numerischen zu Zeichenfolgen
Wenn eine Zahl einem Zeichenfolgedatentyp zugeordnet wird, wird sie mithilfe der Regeln für eine CAST-Spezifikation in den Zielzeichenfolgedatentyp konvertiert.
Wenn ein Zeichen, das kein Leerzeichen ist, während der Umsetzung eines numerischen Werts in einen Zeichen-oder Grafikdatentyp abgeschnitten wird, wird eine Warnung zurückgegeben. Dieses Abschneideverhalten unterscheidet sich von der Zuordnung zu einem Zeichen-oder Grafikdatentyp, der Speicherzuordnungsregeln folgt. Wenn ein Zeichen, das kein Leerzeichen ist, während der Zuordnung abgeschnitten wird, wird ein Fehler zurückgegeben.
Datums-/Uhrzeitzuordnungen
Ein TIME-Wert kann nur einer TIME-Spalte oder einer Zeichenfolgevariablen oder Zeichenfolgespalte zugewiesen werden.
Ein DATE kann einem DATE-, TIMESTAMP-oder Zeichenfolgedatentyp zugeordnet werden. Wenn ein DATE-Wert einem Datentyp TIMESTAMP zugeordnet wird, wird angenommen, dass die fehlenden Zeitinformationen nur Nullen sind.
Ein TIMESTAMP-Wert kann einem Datentyp DATE, TIME, TIMESTAMP oder String zugeordnet werden. Wenn ein TIMESTAMP-Wert einem Datentyp DATE zugeordnet wird, wird der Datumsteil extrahiert und der Zeitabschnitt abgeschnitten. Wenn ein TIMESTAMP-Wert einem Datentyp TIME zugeordnet wird, wird der Datumsteil ignoriert und der Zeitabschnitt extrahiert, wobei die Sekundenbruchteile jedoch abgeschnitten werden. Wenn ein TIMESTAMP-Wert einem TIMESTAMP mit geringerer Genauigkeit zugeordnet wird, werden die überschüssigen Sekundenbruchteile abgeschnitten. Wenn ein TIMESTAMP-Wert einem TIMESTAMP mit höherer Genauigkeit zugeordnet wird, werden fehlende Ziffern als Nullen angenommen.
Die Zuordnung darf nicht zu einer CLOB-, DBCLOB-oder BLOB-Variablen oder -Spalte erfolgen.
Wenn ein Wert für Datum und Uhrzeit einer Zeichenfolgevariablen oder Zeichenfolgespalte zugeordnet wird, erfolgt die Konvertierung in eine Zeichenfolgedarstellung automatisch. Führende Nullen werden in keinem Teil des Datums, der Uhrzeit oder der Zeitmarke weggelassen. Die erforderliche Länge des Ziels variiert abhängig vom Format der Zeichenfolgedarstellung. Wenn die Länge des Ziels größer als erforderlich ist und das Ziel eine Zeichenfolge mit fester Länge ist, wird sie rechts mit Leerzeichen aufgefüllt. Wenn die Länge des Ziels kleiner als erforderlich ist, hängt das Ergebnis vom Typ des beteiligten Werts für Datum und Uhrzeit und vom Typ des Ziels ab.
Wenn das Ziel keine Hostvariable ist und einen Zeichendatentyp hat, ist das Abschneiden nicht zulässig. Das Längenattribut der Spalte muss mindestens 10 für ein Datum, 8 für eine Zeit, 19 für ein TIMESTAMP (0) und 20 +p für TIMESTAMP (p) sein.
- Für ein DATUM: Wenn die Länge der Variablen host weniger als 10 Zeichen beträgt, wird ein Fehler zurückgegeben.
- Für eine ZEIT: Wenn das US-Format verwendet wird, darf die Länge der Variablen host nicht weniger als 8 Zeichen betragen; in anderen Formaten darf die Länge nicht weniger als 5 Zeichen betragen.
Wenn ISO-oder JIS-Formate verwendet werden und die Länge der Hostvariablen weniger als 8 Zeichen beträgt, wird der Sekundenabschnitt der Zeit aus dem Ergebnis ausgeschlossen und der Indikatorvariablen zugeordnet, falls angegeben. Das Feld SQLWARN1 des SQL-Kommunikationsbereichs (SQLCA) wird gesetzt, um die Auslassung anzugeben.
- Für ein TIMESTAMP: Wenn die Länge der Hostvariablen kleiner als 19 Zeichen ist, wird ein Fehler zurückgegeben. Wenn die Länge kleiner als 32 Zeichen, aber größer oder gleich 19 Zeichen ist, werden abschließende Ziffern des Sekundenbruchteils des Werts weggelassen. Das Feld SQLWARN1 des SQL-Kommunikationsbereichs (SQLCA) wird gesetzt, um die Auslassung anzugeben.
Wenn ein DATE einem TIMESTAMP zugeordnet wird, werden die Zeit und die Nachkommastellen der Zeitmarke auf Mitternacht bzw. 0 gesetzt. Wenn ein TIMESTAMP einem DATE zugeordnet wird, wird der Datumsteil extrahiert und die Zeit-und Bruchkomponenten werden abgeschnitten.
Wenn ein TIMESTAMP einer TIME zugeordnet wird, wird der DATE-Teil ignoriert und die Bruchkomponenten werden abgeschnitten.
XML- Zuweisungen
Die allgemeine Regel für XML-Zuordnungen besteht darin, dass nur ein XML-Wert XML-Spalten oder XML-Variablen zugeordnet werden kann. Es gibt wie folgt Ausnahmen von dieser Regel.
- Verarbeitung von XML-Eingabehostvariablen: Dies ist ein Sonderfall der XML-Zuordnungsregel, da die Hostvariable auf einem Zeichenfolgewert basiert. Um die Zuordnung zu XML innerhalb von SQL vorzunehmen, wird der Zeichenfolgewert implizit in einen XML-Wert analysiert, wobei die Einstellung des Sonderregisters CURRENT IMPLICIT XMLPARSE OPTION verwendet wird. Dadurch wird festgelegt, ob Leerzeichen beibehalten oder entfernt werden sollen, es sei denn, die Hostvariable ist ein Argument der Funktion XMLVALIDATE, die immer unnötige Leerzeichen entfernt.
- Zuweisen von Zeichenfolgen zu Eingabeparametermarkierungen des Datentyps XML: Wenn eine Eingabeparametermarkierung den impliziten oder expliziten Datentyp XML aufweist, kann der Wert, der an diese Parametermarke gebunden (zugeordnet) ist, eine Zeichenfolgevariable, eine Grafikzeichenfolgevariable oder eine binäre Zeichenfolgevariable sein. In diesem Fall wird der Zeichenfolgewert implizit in einen XML-Wert analysiert, wobei die Einstellung des Sonderregisters CURRENT IMPLICIT XMLPARSE OPTION verwendet wird, um festzustellen, ob Leerzeichen beibehalten oder entfernt werden sollen, es sei denn, die Parametermarke ist ein Argument der Funktion XMLVALIDATE, die immer unnötige Leerzeichen entfernt.
- Zuweisen von Zeichenfolgen direkt zu XML-Spalten in Datenänderungsanweisungen: Wenn Sie einer Spalte des Typs XML in einer Datenänderungsanweisung direkt zuweisen, kann der zugeordnete Ausdruck auch eine Zeichenfolge oder eine Binärzeichenfolge sein. In diesem Fall wird das Ergebnis von
XMLPARSE (DOCUMENT expression STRIP WHITESPACE)der Zielspalte zugeordnet. Die unterstützten Zeichenfolgedatentypen werden durch die unterstützten Argumente für die Funktion XMLPARSE definiert. Beachten Sie, dass diese XML-Zuordnungsausnahme nicht zulässt, dass Zeichen-oder binäre Zeichenfolgewerte SQL-Variablen oder SQL-Parametern des Datentyps XML zugeordnet werden. - Zuordnen von XML zu Zeichenfolgen beim Abrufen: Wenn XML-Werte in Hostvariablen mit einer Anweisung FETCH INTO oder einer Anweisung EXECUTE INTO in eingebettetem SQL abgerufen werden, kann der Datentyp der Hostvariable CLOB, DBCLOB oder BLOB sein. Bei Verwendung anderer Anwendungsprogrammierschnittstellen (z. B. CLI, JDBCoder .NET) können XML-Werte in Zeichen-, Grafik-oder Binärzeichenfolgetypen abgerufen werden, die von der Anwendungsprogrammierschnittstelle unterstützt werden. In allen diesen Fällen wird der XML-Wert implizit in eine Zeichenfolge serialisiert, die in UTF-8 codiert ist, und für Zeichen-oder Grafikzeichenfolgevariablen in die Client-Codepage konvertiert.
Zeichenfolgewerte oder binäre Zeichenfolgewerte können nicht in XML-Hostvariablen abgerufen werden. Werte in XML-Hostvariablen können Spalten, SQL-Variablen oder SQL-Parametern eines Zeichenfolgedatentyps oder eines binären Zeichenfolgedatentyps nicht zugeordnet werden.
Die Zuweisung zu XML-Parametern und -Variablen in integrierten SQL-UDFs und SQL-Prozeduren erfolgt durch Referenz. Die Übergabe von Parametern des Datentyps XML zum Aufrufen einer integrierten SQL-UDF oder SQL-Prozedur erfolgt ebenfalls durch Referenz. Wenn XML-Werte nach Referenz übergeben werden, werden alle Eingabeknotenbaumstrukturen direkt verwendet. Diese direkte Verwendung behält alle Eigenschaften bei, einschließlich der Dokumentreihenfolge, der ursprünglichen Knotenidentitäten und aller übergeordneten Eigenschaften.
Benutzerdefinierte Typzuordnungen
Zuordnungen mit benutzerdefinierten Typwerten ermöglichen in der Regel die Zuordnung zu demselben benutzerdefinierten Typnamen mit einigen zusätzlichen Regeln für die verschiedenen Arten von benutzerdefinierten Typen. Weitere Informationen zu bestimmten benutzerdefinierten Typen finden Sie in den folgenden Abschnitten.
Stark typisierte einzigartige Typzuordnungen
- Zuordnungen zu Hostvariablen
- Die Zuordnung eines stark typisierten einzigartigen Typwerts zu einer Hostvariablen (oder Parametermarke) basiert auf dem Quellendatentyp des einzigartigen Datentyps. Daher kann der Wert eines stark typisierten einzigartigen Datentyps nur dann einer Hostvariablen (oder Parametermarke) zugeordnet werden, wenn der Quellendatentyp des einzigartigen Datentyps der Variablen zugeordnet werden kann.Beispiel: Der einzigartige Typ AGE wird von der folgenden SQL-Anweisung erstellt:
Wenn die Anweisung ausgeführt wird, werden auch die folgenden Umsetzungsfunktionen generiert:CREATE TYPE AGE AS SMALLINT
Als Nächstes wird angenommen, dass die Spalte STU_AGE in der Tabelle STUDENTS mit dem einzigartigen Typ AGE definiert wurde. Betrachten Sie nun diese gültige Zuordnung des Alters eines Studenten zur Hostvariablen HV_AGE, die einen INTEGER-Datentyp hat:AGE (SMALLINT) RETURNS AGE AGE (INTEGER) RETURNS AGE SMALLINT (AGE) RETURNS SMALLINT
Der stark typisierte einzigartige Typwert kann der Hostvariablen HV_AGE zugeordnet werden, da der Quellendatentyp des einzigartigen Typs (SMALLINT) der Hostvariablen (INTEGER) zugeordnet werden kann. Wenn der stark typisierte einzigartige Datentyp AGE auf einen Datentyp für Datum und Uhrzeit wie DATE bezogen wurde, wäre die vorhergehende Zuordnung ungültig, da ein Datentyp für Datum und Uhrzeit nicht einem ganzzahligen Typ zugeordnet werden kann.SELECT STU_AGE INTO :HV_AGE FROM STUDENTS WHERE STU_NUMBER = 200 - Andere Zuordnungen als zu Hostvariablen
- Ein stark typisierter einzigartiger Datentyp kann entweder die Quelle oder das Ziel einer Zuordnung sein. Die Zuweisung basiert darauf, ob der Datentyp des zuzuordnenden Werts in den Datentyp des Ziels umgesetzt werden kann (Informationen zu den Umsetzungen, die unterstützt werden, wenn ein einzigartiger Typ beteiligt ist, finden Sie unter Umsetzung zwischen Datentypen ). Ein stark typisierter einzigartiger Typwert kann in den folgenden Fällen jedem anderen Ziel als Host einer Variablen zugeordnet werden:
- Das Ziel der Zuordnung hat denselben einzigartigen Datentyp.
- Der einzigartige Typ kann in den Datentyp des Ziels umgesetzt werden.
- Der zuzuordnende Wert hat denselben einzigartigen Datentyp wie das Ziel.
- Der Datentyp des zugeordneten Werts kann in den einzigartigen Zieltyp umgesetzt werden.
Der Quellendatentyp für den stark typisierten einzigartigen Datentyp AGE ist beispielsweise SMALLINT:
Als Nächstes wird angenommen, dass die Tabellen TABLE1 und TABLE2 mit vier identischen Spaltenbeschreibungen erstellt werden:CREATE TYPE AGE AS SMALLINT
Verwenden Sie die folgende SQL-Anweisung und setzen Sie verschiedene Werte für X und Y ein, um Werte in verschiedene Spalten von TABLE1 aus TABLE2einzufügen. Der Datenbankmanager verwendet Zuordnungsregeln in dieser Anweisung INSERT, um festzustellen, ob X Y zugeordnet werden kann. Tabelle 2 zeigt, ob die Zuordnungen gültig sind.AGECOL AGE SMINTCOL SMALLINT INTCOL INTEGER DECCOL DECIMAL(6,2)INSERT INTO TABLE1(Y) SELECT X FROM TABLE2;Tabelle 2. Bewertung verschiedener Zuordnungen TABLE2.X TABLE1.Y Gültig Ursache AGEKOL AGEKOL Yes Quelle und Ziel haben denselben einzigartigen Datentyp SMINTKOL AGEKOL Yes SMALLINT kann in AGE umgesetzt werden INTKOL AGEKOL Yes INTEGER kann in AGE umgesetzt werden, weil der AGE-Quellentyp SMALLINT ist DECKOL AGEKOL Nein DECIMAL kann nicht in AGE umgesetzt werden AGEKOL SMINTKOL Yes AGECOL kann in den Quellentyp SMALLINT umgesetzt werden. AGEKOL INTKOL Nein AGE kann nicht in INTEGER umgesetzt werden AGEKOL DECKOL Nein AGE kann nicht in DECIMAL umgesetzt werden
Schwach typisierte einzigartige Typzuordnungen
Der Wert eines schwach typisierten einzigartigen Typs kann gemäß den Zuordnungsregeln für den Quellentyp des schwach typisierten einzigartigen Typs zugeordnet werden. Wenn für das Zuordnungsziel ein einzigartiger Datentyp mit Datentypeinschränkungen definiert ist, werden die Datentypeinschränkungen auf den Quellenwert angewendet und müssen als 'true' oder 'unknown' ausgewertet werden.
Zuordnungen strukturierter Typen
Der Wert eines strukturierten Typs kann zugeordnet werden, wenn das Ziel der Zuordnung denselben strukturierten Typ oder einen seiner Supertypen hat, außer in Fällen, die Hostvariablen einbeziehen.
- Ein Quellenwert eines strukturierten Typs kann nur dann einer Zielhostvariablen zugeordnet werden, wenn der deklarierte Typ der Hostvariablen der strukturierte Typ oder ein übergeordneter Typ des strukturierten Typs ist.
Wenn das Ziel der Zuordnung eine Spalte eines strukturierten Typs ist, muss der Quellendatentyp der Zieldatentyp oder ein Subtyp des Zieldatentyps sein.
Array-Typzuordnungen
Der Wert für ein Element eines Arrays muss dem Datentyp der Array-Elemente zugeordnet werden können. Die Zuordnungsregeln für diesen Datentyp gelten für die Wertzuordnung. Der für einen Index in der Feldgruppe angegebene Wert muss dem Datentyp des Index für die Feldgruppe zugeordnet werden können. Die Zuordnungsregeln für diesen Datentyp gelten für die Wertzuordnung. Für eine normale Feldgruppe ist der Indexdatentyp INTEGER und für eine assoziative Feldgruppe ist der Datentyp entweder INTEGER oder VARCHAR (n), wobei n ein beliebiges gültiges Längenattribut für den Datentyp VARCHAR ist. Wenn der Indexwert für eine Zuordnung zu einem normalen Array größer als die aktuelle Kardinalität des Arrays ist, wird die Kardinalität des Arrays auf den neuen Indexwert erhöht, sofern der Wert den Maximalwert für einen INTEGER-Datentyp nicht überschreitet. Eine Zuordnung eines neuen Elements zu einem assoziativen Array erhöht die Kardinalität um genau 1, da die Indexwerte dünn sein können.
- Wenn die rechte Seite der Zuordnung eine SQL-Variable oder ein SQL-Parameter, ein Aufruf der Funktion TRIM_ARRAY, ein Aufruf der Funktion ARRAY_DELETEoder ein CAST-Ausdruck ist, muss ihr Typ mit dem Typ der SQL-Variablen oder des Parameters auf der linken Seite der Zuordnung identisch sein.
- Wenn die rechte Seite der Zuordnung ein Array-Konstruktor oder ein Aufruf der Funktion ARRAY_AGG ist, wird sie implizit in den Typ der SQL-Variablen oder des Parameters auf der linken Seite umgesetzt.
SET V = ARRAY[1,2,3];ist äquivalent zu:SET V = CAST(ARRAY[1,2,3] AS MYARRAY);Und die Anweisung:SELECT ARRAY_AGG(C1) INTO V FROM Tist äquivalent zu:SELECT CAST(ARRAY_AGG(C1) AS MYARRAY) INTO V FROM T- Feldgruppenvariable zu einer anderen Feldgruppenvariable mit demselben Feldgruppentyp wie die Quellenvariable.
- Ein Ausdruck des Typs array für eine Array-Variable, wobei der Array-Elementtyp im Quellenausdruck dem Array-Elementtyp in der Ziel-Array-Variablen zugeordnet werden kann.
Zeilentypzuordnungen
Zuordnungen zu Feldern innerhalb einer Zeilenvariablen müssen denselben Regeln entsprechen, als ob das Feld selbst eine Variable desselben Datentyps wie das Feld wäre. Eine Zeilenvariable kann nur einer Zeilenvariablen mit demselben benutzerdefinierten Zeilentyp zugeordnet werden. Wenn Sie FETCH, SELECT oder VALUES INTO verwenden, um einer Zeilenvariablen Werte zuzuordnen, müssen die Quellenwerttypen den Zielzeilenfeldern zugeordnet werden können. Wenn die Quellen-oder Zielvariable (oder beide) einer Zuordnung in der Zeile einer Tabelle oder Ansicht verankert ist, muss die Anzahl der Felder gleich sein und die Feldtypen des Quellenwerts müssen den Feldtypen des Zielwerts zugeordnet werden können.
Cursortypzuordnungen
- Einen Cursorwertkonstruktor
- Ein Wert des integrierten Typs CURSOR
- Ein Wert eines beliebigen benutzerdefinierten Cursortyps
- Einen Cursorwertkonstruktor
- Ein Wert des integrierten Typs CURSOR
- Ein Wert eines benutzerdefinierten Cursortyps mit demselben Typnamen
- Einen Cursorwertkonstruktor
- Ein Wert eines benutzerdefinierten Cursortyps mit demselben Typnamen
Zuordnungen boolescher Typen
- WAHR
- FALSCH
- NULL
Referenztypzuordnungen
Ein Verweistyp mit dem Zieltyp T kann einer Referenztypspalte zugeordnet werden, die auch ein Verweistyp mit dem Zieltyp S ist, wobei S ein Supertyp von Tist. Wenn eine Zuordnung zu einer Bereichsreferenzspalte oder -variablen vorgenommen wird, wird keine Prüfung durchgeführt, um sicherzustellen, dass der tatsächliche Wert, der zugeordnet wird, in der durch den Bereich definierten Zieltabelle oder -sicht vorhanden ist.
- Ein Wert eines Referenztyps auf der rechten Seite einer Zuordnung kann einer Hostvariable auf der linken Seite nur dann zugeordnet werden, wenn der Darstellungstyp dieses Referenztyps dieser Hostvariablen zugeordnet werden kann.
Wenn das Ziel der Zuordnung eine Spalte und die rechte Seite der Zuordnung eine Hostvariable ist, muss die Hostvariable explizit in den Referenztyp der Zielspalte umgesetzt werden.
Numerische Vergleiche
Zahlen werden algebraisch verglichen, d. h. in Bezug auf Vorzeichen. Zum Beispiel ist -2 kleiner als +1.
Wenn eine Zahl eine ganze Zahl und die andere eine Dezimalzahl ist, wird der Vergleich mit einer temporären Kopie der Ganzzahl durchgeführt, die in eine Dezimalzahl konvertiert wurde.
Wenn Dezimalzahlen mit unterschiedlichen Kommastellen verglichen werden, wird der Vergleich mit einer temporären Kopie einer der Zahlen durchgeführt, die mit abschließenden Nullen erweitert wurde, sodass ihr Bruchteil dieselbe Anzahl von Ziffern wie die andere Zahl hat.
Wenn eine Zahl Gleitkomma ist und die andere eine Ganzzahl oder Dezimalzahl ist, wird der Vergleich mit einer temporären Kopie der anderen Zahl durchgeführt, die in Gleitkommazahlen mit doppelter Genauigkeit konvertiert wurde.
Zwei Gleitkommazahlen sind nur gleich, wenn die Bitkonfigurationen ihrer normalisierten Formen identisch sind.
Wenn eine Zahl eine dezimale Gleitkommazahl ist und die andere Zahl eine Ganzzahl, eine Dezimalzahl, eine Gleitkommazahl mit einfacher Genauigkeit oder eine Gleitkommazahl mit doppelter Genauigkeit ist, wird der Vergleich mit einer temporären Kopie der anderen Zahl durchgeführt, die in eine dezimale Gleitkommazahl konvertiert wurde.
Wenn eine Zahl DECFLOAT (16) und die andere Zahl DECFLOAT (34) ist, wird der Wert DECFLOAT (16) in DECFLOAT (34) konvertiert, bevor der Vergleich durchgeführt wird.
Der dezimale Gleitkommadatentyp unterstützt sowohl positive als auch negative Nullen. Positive und negative Null haben unterschiedliche binäre Darstellungen, aber das Prädikat = (gleich) gibt 'true' für Vergleiche von negativer und positiver Null zurück.
Die Skalarfunktionen COMPARE_DECFLOAT und TOTALORDER können verwendet werden, um Vergleiche auf binärer Ebene durchzuführen, wenn beispielsweise ein Vergleich von 2.0 < > 2.00 erforderlich ist.
Der dezimale Gleitkommadatentyp unterstützt die Angabe von negativ und positiv NaN (quiet und Signalisierung) sowie negativ und positiv unendlich. Aus SQL-Sicht ist INFINITY = INFINITY, NAN = NAN, SNAN = SNAN und -0 = 0.
- (+ /-) INFINITY vergleicht nur (+ /-) INFINITY mit demselben Vorzeichen.
- (+ /-) NAN vergleicht nur (+ /-) NAN des gleichen Zeichens.
- (+ /-) SNAN vergleicht nur gleich (+ /-) SNAN mit demselben Vorzeichen.
- -NAN < -SNAN < -UNENDLICH < 0 < UNENDLICH < SNAN < NAN
Wenn Zeichenfolgedatentypen und numerische Datentypen verglichen werden, wird die Zeichenfolge mithilfe der Regeln für eine CAST-Spezifikation in DECFLOAT (34) umgesetzt. Die Zeichenfolge muss eine gültige Zeichenfolgedarstellung einer Zahl enthalten.
Zeichenfolgevergleiche
- Binärzeichenfolgevergleiche
- Binärzeichenfolgevergleiche werden immer durch einen Vergleich der Binärwerte für die entsprechenden Byte jeder Zeichenfolge durchgeführt. Außerdem sind zwei Binärzeichenfolgen nur gleich, wenn die tatsächliche Länge der beiden Zeichenfolgen identisch ist. Die kürzere Zeichenfolge wird als kleiner als die längere Zeichenfolge betrachtet, wenn sie ansonsten gleich der Länge der kürzeren Zeichenfolge ist. Binärzeichenfolgen können nicht mit Zeichenfolgen verglichen werden, es sei denn, die Zeichenfolge wird in eine Binärzeichenfolge umgesetzt oder die Zeichenfolge hat den Subtyp FOR BIT DATA. In diesem Fall wird die FOR BIT DATA-Zeichenfolge wie eine Binärzeichenfolge behandelt.
BLOB-Zeichenfolgen mit einer tatsächlichen Länge von weniger als 32673 Byte werden als Operanden in Basisvergleichselementen, IN, BETWEEN und dem einfachen CASE -Ausdruck unterstützt. In Vergleichen, die das Prädikat LIKE, das Prädikat NULL und die Funktion POSSTR verwenden, werden BLOB-Zeichenfolgen beliebiger Länge weiterhin unterstützt.
- Zeichen-und Grafikzeichenfolgevergleiche
- Zeichenfolgen werden gemäß der Sortierfolge verglichen, die bei der Erstellung der Datenbank angegeben wurde, mit den folgenden Ausnahmen:
- Zeichenfolgen mit einem Attribut FOR BIT DATA werden immer entsprechend ihren Bitwerten verglichen.
- In einer Nicht-Unicode-Datenbank verwenden Zeichenfolgevergleiche, die einen Unicode-Zeichenfolgedatentyp einbeziehen, die alternative Sortierfolge.
Beim Vergleich von Zeichenfolgen unterschiedlicher Länge wird der Vergleich unter Verwendung einer logischen Kopie der kürzeren Zeichenfolge durchgeführt, die rechts mit Leerzeichen aufgefüllt wird, um ihre Länge auf die Länge der längeren Zeichenfolge zu erweitern. Diese logische Erweiterung wird für alle Zeichenfolgen ausgeführt, einschließlich der Zeichenfolgen, die als FOR BIT DATA gekennzeichnet sind.
Zeichenfolgen (außer Zeichenfolgen, die als FOR BIT DATA gekennzeichnet sind) werden entweder gemäß der Sortierfolge verglichen, die bei der Erstellung der Datenbank angegeben wurde, oder gemäß der alternativen Sortierfolge. Die vom Datenbankmanager bereitgestellte Standardsortierfolge kann beispielsweise Kleinbuchstaben und Großbuchstaben desselben Zeichens dieselbe Wertigkeit geben. Der Datenbankmanager führt einen Vergleich mit zwei Arbeitsgängen aus, um sicherzustellen, dass nur identische Zeichenfolgen als gleich betrachtet werden. Im ersten Arbeitsgang werden Zeichenfolgen entsprechend der Sortierfolge der Datenbank verglichen. Wenn die Gewichtungen der Zeichen in den Zeichenfolgen gleich sind, wird ein zweiter Tiebreaker-Durchlauf ausgeführt, um die Zeichenfolgen auf der Basis ihrer tatsächlichen Codepunktwerte zu vergleichen.
Zwei Zeichenfolgen sind gleich, wenn beide leer sind oder wenn alle entsprechenden Byte gleich sind. Wenn einer der Operanden null ist, ist das Ergebnis unbekannt.
LOB-Zeichenfolgen mit einer tatsächlichen Länge von weniger als 32673 Byte werden nun als Operanden in Basisvergleichselementen, IN, BETWEEN und dem einfachen CASE-Ausdruck unterstützt. LOB-Zeichenfolgen beliebiger Länge werden weiterhin in Vergleichen unterstützt, die das Vergleichselement LIKE, das Vergleichselement NULL und die Funktion POSSTR verwenden.
LOB-Zeichenfolgen werden in anderen Vergleichsoperationen wie MAX, MIN, DISTINCT, GROUP BY und ORDER BY nicht unterstützt.
Teile von Zeichenfolgen können mit den Skalarfunktionen SUBSTR und VARCHAR verglichen werden. Beispiel für die Spalten:MY_SHORT_CLOB CLOB(300) MY_LONG_VAR VARCHAR(8000)In diesem Fall ist Folgendes gültig:WHERE VARCHAR(MY_SHORT_CLOB) > VARCHAR(SUBSTR(MY_LONG_VAR,1,300))Beispiele:
Für diese Beispiele haben 'A', 'Á', 'a' und 'á' die Codepunktwerte X'41 ', X'C1', X'61 'und X'E1'.
Betrachten Sie eine Sortierfolge, bei der die Zeichen 'A', 'Á', 'a', 'á' die Gewichtungen 136, 139, 135 und 138 haben. Dann sortieren die Zeichen in der Reihenfolge ihrer Gewichtungen wie folgt:'a' < 'A' < 'á' < 'Á'Betrachten Sie nun vier DBCS-Zeichen D1, D2, D3und D4 mit den Codepunkten 0xC141, 0xC161, 0xE141, und 0xE161. Wenn diese DBCS-Zeichen in CHAR-Spalten enthalten sind, werden sie entsprechend den Sortierfolgegewichtungen dieser Byte als Bytefolge sortiert. Die ersten Byte haben Gewichtungen von 138 und 139, daher stehen D3 und D4 vor D2 und D1; die zweiten Byte haben Gewichtungen von 135 und 136. Daher lautet die Reihenfolge wie folgt:D4 < D3 < D2 < D1Wenn die Werte, die verglichen werden, jedoch das Attribut FOR BIT DATA haben oder wenn diese DBCS-Zeichen in einer Spalte GRAPHIC gespeichert wurden, werden die Sortierfolgegewichtungen ignoriert und Zeichen werden entsprechend ihren Codepunkten wie folgt verglichen:'A' < 'a' < 'Á' < 'á'Die DBCS-Zeichen werden als Bytefolge in der Reihenfolge der Codepunkte wie folgt sortiert:D1 < D2 < D3 < D4Nehmen Sie nun eine Sortierfolge an, bei der die Zeichen 'A', 'Á', 'a', 'á' (nicht eindeutige) Gewichtungen 74, 75, 74 und 75 aufweisen. Bei Sortierfolgegewichtungen allein (erster Arbeitsgang) ist 'a' gleich 'A' und 'á 'gleich' Á '. Die Codepunkte der Zeichen werden verwendet, um die Bindung (zweiter Durchgang) wie folgt zu unterbrechen:'A' < 'a' < 'Á' < 'á'DBCS-Zeichen in CHAR-Spalten sortieren eine Folge von Byte nach ihrer Gewichtung (erster Durchgang) und dann nach ihren Codepunkten, um die Bindung zu unterbrechen (zweiter Durchgang). Die ersten Byte weisen gleiche Gewichtungen auf, sodass die Codepunkte (0xC1 und 0xE1) die Bindung unterbrechen. Daher werden die Zeichen D1 und D2 vor den Zeichen D3 und D4sortiert. Dann werden die zweiten Bytes auf ähnliche Weise verglichen, und das Endergebnis lautet wie folgt:D1 < D2 < D3 < D4Wenn die Daten in CHAR-Spalten das Attribut FOR BIT DATA haben oder wenn die DBCS-Zeichen in einer Spalte GRAPHIC gespeichert werden, werden die Sortierfolgengewichtungen ignoriert und die Zeichen werden entsprechend ihren Codepunkten verglichen:D1 < D2 < D3 < D4Für dieses spezielle Beispiel ist das Ergebnis dasselbe wie bei der Verwendung von Sortiergewichtungen, aber dies ist offensichtlich nicht immer der Fall.
Konvertierungsregeln für Vergleich
Wenn zwei Zeichenfolgen verglichen werden, wird eine der Zeichenfolgen bei Bedarf zuerst in das Schema für Codeumsetzung, die Codepage und die Sortierfolge der anderen Zeichenfolge konvertiert.
Sortierung von Ergebnissen
Ergebnisse, die sortiert werden müssen, werden auf der Basis der Regeln für Zeichenfolgevergleiche sortiert, die im Abschnitt Zeichenfolgevergleicheerläutert werden. Der Vergleich wird auf dem Datenbankserver ausgeführt. Bei der Rückgabe von Ergebnissen an die Clientanwendung kann eine Codepagekonvertierung durchgeführt werden. Diese nachfolgende Codepagekonvertierung hat keine Auswirkungen auf die Reihenfolge der vom Server bestimmten Ergebnismenge.
MBCS-Aspekte für Zeichenfolgevergleiche
Gemischte SBCS/MBCS-Zeichenfolgen werden entsprechend der Sortierfolge verglichen, die beim Erstellen der Datenbank angegeben wurde. Bei Datenbanken, die mit der Standardsortierfolge (SYSTEM) erstellt wurden, werden alle Einzelbyte-ASCII-Zeichen in der richtigen Reihenfolge sortiert, aber Doppelbytezeichen sind nicht unbedingt in Codepunktfolge. Bei Datenbanken, die mit der Sequenz IDENTITY erstellt wurden, werden alle Doppelbytezeichen ordnungsgemäß in ihrer Codepunktreihenfolge sortiert. Einzelbyte-ASCII-Zeichen werden jedoch auch in ihrer Codepunktreihenfolge sortiert. Für Datenbanken, die mit der Sequenz COMPATIBILITY erstellt wurden, wird eine Kompromissreihenfolge verwendet, die für die meisten Doppelbytezeichen korrekt sortiert und für ASCII fast korrekt ist.
Gemischte Zeichenfolgen werden byteweise verglichen. Dies kann zu ungewöhnlichen Ergebnissen für Mehrbytezeichen führen, die in gemischten Zeichenfolgen auftreten, da jedes Byte unabhängig betrachtet wird.
Beispiel:
In diesem Beispiel haben die Doppelbytezeichen 'A', 'B', 'a' und 'b' die Codepunktwerte X'8260 ', X'8261', X'8281 'bzw. X'8282'.
'B' < 'A' < 'a' < 'b'und 'AB' < 'AA' < 'Aa' < 'Ab' < 'aB' < 'aA' < 'aa' < 'ab'Grafikzeichenfolgevergleiche werden analog zu Zeichenfolgen verarbeitet.
Grafikzeichenfolgevergleiche sind zwischen allen Grafikzeichenfolgedatentypen außer DBCLOB gültig.
Bei Grafikzeichenfolgen wird die Sortierfolge der Datenbank nicht verwendet. Stattdessen werden Grafikzeichenfolgen immer auf der Basis der numerischen (binären) Werte ihrer entsprechenden Bytes verglichen.
'A' < 'B' < 'a' < 'b'und 'AA' < 'AB' < 'Aa' < 'Ab' < 'aA' < 'aB' < 'aa' < 'ab'Beim Vergleich von Grafikzeichenfolgen unterschiedlicher Länge wird der Vergleich unter Verwendung einer logischen Kopie der kürzeren Zeichenfolge durchgeführt, die rechts mit Doppelbyte-Leerzeichen aufgefüllt wird, um ihre Länge auf die Länge der längeren Zeichenfolge zu erweitern.
Zwei Grafikwerte sind gleich, wenn beide leer sind oder wenn alle entsprechenden Grafiken gleich sind. Wenn einer der Operanden null ist, ist das Ergebnis unbekannt. Wenn zwei Werte nicht gleich sind, wird ihre Beziehung durch einen einfachen Binärzeichenfolgevergleich bestimmt.
Wie in diesem Abschnitt angegeben, kann der Vergleich von Zeichenfolgen auf Bytebasis zu ungewöhnlichen Ergebnissen führen, d. h. zu einem Ergebnis, das sich von dem unterscheidet, was bei einem Vergleich von Zeichen zu Zeichen erwartet wird. Bei den hier gezeigten Beispielen wird dieselbe MBCS-Codepage vorausgesetzt, die Situation kann jedoch weiter kompliziert sein, wenn verschiedene Mehrbyte-Codepages mit derselben Landessprache verwendet werden. Betrachten Sie zum Beispiel den Fall des Vergleichs einer Zeichenfolge aus einer japanischen DBCS-Codepage und einer japanischen EUC-Codepage.
Datums-/Zeitvergleiche
Ein Datums-, Zeit-oder Zeitmarkenwert kann mit einem anderen Wert desselben Datentyps, einer Datums-/Zeitkonstante desselben Datentyps oder mit einer Zeichenfolgedarstellung eines Werts dieses Datentyps verglichen werden. Ein Datumswert oder eine Zeichenfolgedarstellung eines Datums kann auch mit einem TIMESTAMP verglichen werden, wobei angenommen wird, dass die fehlenden Zeitinformationen für den Datumswert nur Nullen sind. Alle Vergleiche sind chronologisch, was bedeutet, je weiter ein Zeitpunkt ab dem 1. Januar 0001 ist, desto größer ist der Wert dieses Zeitpunkts. Die Zeit 24:00:00 ist größer als die Zeit 00:00:00.
Vergleiche, die Zeitwerte und Zeichenfolgedarstellungen von Zeitwerten einbeziehen, enthalten immer Sekunden. Wenn die Zeichenfolgedarstellung Sekunden ausschließt, werden null Sekunden impliziert.
- Beim Vergleich von Zeitmarkenwerten mit unterschiedlichen Genauigkeiten wird die höhere Genauigkeit für den Vergleich verwendet und alle fehlenden Ziffern für Sekundenbruchteile werden als null angenommen.
- Beim Vergleich eines Zeitmarkenwerts mit einer Zeichenfolgedarstellung einer Zeitmarke wird die Zeichenfolgedarstellung zuerst in TIMESTAMP (12) konvertiert.
- Zeitmarkenvergleiche sind chronologisch ohne Berücksichtigung von Darstellungen, die als äquivalent betrachtet werden können. Daher ist das folgende Vergleichselement wahr:
TIMESTAMP('1990-02-23-00.00.00') > '1990-02-22-24.00.00'
Benutzerdefinierte Typvergleiche
Informationen zu Vergleichen mit benutzerdefinierten Typen finden Sie in den folgenden Abschnitten.
Stark typisierte einzigartige Typvergleiche
Werte mit einem stark typisierten einzigartigen Datentyp können nur mit Werten desselben stark typisierten einzigartigen Typs verglichen werden.
CREATE TYPE YOUTH AS INTEGER
CREATE TABLE CAMP_DB_ROSTER
( NAME VARCHAR(20),
ATTENDEE_NUMBER INTEGER NOT NULL,
AGE YOUTH,
HIGH_SCHOOL_LEVEL YOUTH) SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > HIGH_SCHOOL_LEVEL SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > ATTENDEE_NUMBER SELECT * FROM CAMP_DB_ROSTER
WHERE INTEGER(AGE) > ATTENDEE_NUMBER
SELECT * FROM CAMP_DB_ROSTER
WHERE CAST( AGE AS INTEGER) > ATTENDEE_NUMBER
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > YOUTH(ATTENDEE_NUMBER)
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > CAST(ATTENDEE_NUMBER AS YOUTH)Schwach typisierte einzigartige Typvergleiche
Werte mit einem schwach typisierten einzigartigen Datentyp werden gemäß den Vergleichsregeln für den Quellentyp des einzigartigen Typs verglichen. Datentypeinschränkungen haben keine Auswirkung auf den Vergleich. Es ist zulässig, verschiedene schwach typisierte einzigartige Typen zu vergleichen, wenn die zugrunde liegenden Quellentypen vergleichbar sind.
Vergleiche strukturierter Typen
Werte mit einem benutzerdefinierten strukturierten Typ können nicht mit anderen Werten verglichen werden (das Prädikat NULL und das Vergleichselement TYPE können verwendet werden).
Array-Typvergleiche
Vergleiche von Feldgruppentypwerten werden nicht unterstützt. Elemente von Arrays können basierend auf den Vergleichsregeln für den Datentyp der Elemente verglichen werden.
Zeilentypvergleiche
Eine Zeilenvariable kann nicht mit einer anderen Zeilenvariablen verglichen werden, auch wenn der Zeilentypname identisch ist. Einzelne Felder innerhalb eines Zeilentyps können mit anderen Werten verglichen werden und die Vergleichsregeln für den Datentyp des Felds gelten.
Cursortypvergleiche
Eine Cursorvariable kann nicht mit einer anderen Cursorvariablen verglichen werden, auch wenn der Cursortypname identisch ist.
Boolesche Typvergleiche
Ein boolescher Wert kann mit einem anderen booleschen Wert verglichen werden oder mit einem Wert, der in einen booleschen Wert umgesetzt werden kann. Der Wert TRUE ist größer als der Wert FALSE.
Referenztypvergleiche
Referenztypwerte können nur verglichen werden, wenn ihre Zieltypen einen gemeinsamen Supertyp haben. Die entsprechende Vergleichsfunktion wird nur gefunden, wenn der Schemaname des allgemeinen Supertyps im SQL-Pfad enthalten ist. Der Vergleich wird mit dem Darstellungstyp der Referenztypen durchgeführt. Der Geltungsbereich der Referenz wird im Vergleich nicht berücksichtigt.
XML-Vergleiche in einer Nicht-Unicode-Datenbank
Bei der Ausführung in einer Nicht-Unicode-Datenbank erfordern Vergleiche zwischen XML-Daten und Zeichen-oder Grafikzeichenfolgewerten eine Codepagekonvertierung einer der beiden zu vergleichenden Datengruppen. Zeichen -oder Grafikwerte , die in einer SQL-oder XQuery-Anweisung verwendet werden, entweder als Abfrageprädikat oder als Hostvariable mit einem Datentyp für Zeichen-oder Grafikzeichenfolgen , werden vor dem Vergleich in die Datenbankcodepage konvertiert. Wenn Zeichen, die in diesen Daten enthalten sind, Codepunkte haben, die nicht Teil der Datenbankcodepage sind, werden an ihrer Stelle Substitutionszeichen hinzugefügt, die möglicherweise zu unerwarteten Ergebnissen für die Abfrage führen.
Beispiel: Ein Client mit einer UTF-8 -Codepage wird verwendet, um eine Verbindung zu einem Datenbankserver herzustellen, der mit der griechischen Codierung ISO8859-7erstellt wurde. Der Ausdruck ΣGΣM wird als Prädikat einer XQuery-Anweisung gesendet, wobei ΣG das griechische Sigmazeichen in Unicode (U+03A3) und ΣM das mathematische Symbol sigma in Unicode (U+2211). Dieser Ausdruck wird zuerst in die Datenbankcodepage konvertiert, sodass beide "Σ" -Zeichen in den entsprechenden Codepunkt für Sigma in der griechischen Datenbankcodepage 0xD3konvertiert werden. Dieser Codepunkt kann als ΣAbezeichnet werden. Der neu konvertierte Ausdruck ΣAΣA wird dann erneut in UTF-8 konvertiert, um mit den XML-Zieldaten zu vergleichen. Da die Unterscheidung zwischen diesen beiden Codepunkten als Ergebnis der Codepagekonvertierung verloren ging, die erforderlich ist, um den Prädikatausdruck an die Datenbank zu übergeben, werden die beiden anfänglich unterschiedlichen Werte ΣG und ΣM als Ausdruck ΣGΣGan den XML-Parser übergeben. Dieser Ausdruck stimmt dann nicht mit dem Wert ΣGΣM in einem XML-Dokument überein.
Eine Möglichkeit, unerwartete Abfrageergebnisse zu vermeiden, die durch Codepagekonvertierungsprobleme verursacht werden können, besteht darin, sicherzustellen, dass alle Zeichen, die in einem Abfrageausdruck verwendet werden, übereinstimmende Codepunkte in der Datenbankcodepage haben. Zeichen, die keine übereinstimmenden Codepunkte haben, können durch die Verwendung einer Unicode-Zeichenentitätsreferenz eingeschlossen werden. Eine Zeichenentitätsreferenz umgeht immer die Codepagekonvertierung. Die Verwendung der Zeichenentitätsreferenz ࢣ anstelle des ΣM -Zeichens stellt beispielsweise sicher, dass der richtige Unicode-Codepunkt für den Vergleich verwendet wird, unabhängig von der Datenbankcodepage.