ORA-12899: Aber mein String ist doch nicht zu lang?

Mit dem Fehler ORA-12899 möchte die Datenbank sagen, dass eine Zeichenfolge nicht in die gewünschte Varchar2 Spalte passt. In der Regel ist der String auch wirklich viel zu lang für die Spalte und der Fehler liegt woanders.

In vielen anderen Fällen ist vielleicht eine Eigenheit des Varchar2 Datentyps unter Oracle die Ursache.

Erst einmal den Fehler reproduzieren:

create table test_tab(testcol varchar2(5 byte));

insert into test_tab values('12345'); -->ok

commit;

insert into test_tab values('1234Ä'); -->Fehler

Das erste Insert-Statement hat wie gewollt funktioniert. Das zweite liefert folgenden Fehler:


/*
SQL-Fehler: ORA-12899: Wert zu groß für Spalte "TEST_TAB"."TESTCOL" (aktuell: 6, maximal: 5)
ORA-12899. 00000 - "value too large for column %s (actual: %s, maximum: %s)"
*/

Die Zeichenfolge „1234Ä“ ist aber doch gar nicht länger als in der Definition?

Bei genauerer Betrachtung sind dort aber nur 5 Byte reserviert worden. Oracle möchte aber das „Ä“ (abhängig vom Zeichensatz) intern mit 2 Byte abspeichern – und die Create Table Anweisung erlaubt derweil nicht 5 Zeichen sondern eben 5 Byte. Gleiches gilt für alle anderen Umlaute, Sonderzeichen und sonstigen UTF8-Zeichen.

Ein genauerer Blick auf die Oracle interne Abbildung bestätigt das:


select dump('1234Ä') from test_tab2

DUMP('1234Ä')
=============
Typ=96 Len=6: 49,50,51,52,195,132

Hier ist eindeutig die Länge 6 zu sehen; die einzelnen Zahlen lassen sich auf die entsprechenden Codetabellen umsetzen.

Abhilfe? Ganz einfach!
Die bessere Definition der Spalte lautet wie folgt:


create table test_tab2(testcol varchar2(5 char));

insert into test_tab2 values('1234Ä'); --> ok

Unabhängig von der Installation und Konfiguration der verwendeten Oracle Datenbank nimmt die Spalte nun wirklich auch 5 Char/Zeichen statt 5 Byte auf – ganz ohne ORA-12899.

Dieser Beitrag wurde unter Oracle veröffentlicht. Setze ein Lesezeichen auf den Permalink.