Thread Stringlänge ermitteln für ORACLE (13 answers)
Opened by tcicit at 2013-01-29 10:10

payx
 2013-01-30 11:09
#165329 #165329
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo,

das Problem tritt natürlich nur auf, wenn die Datenbank UTF-8 benutzt, z.B. NLS_CHARACTERSET = 'AL32UTF8'

2013-01-29T10:46:13 Muffi
VARCHAR2(2000) in Oracle heisst 2000 Bytes, nicht 2000 Zeichen.

Zumindest in neueren Versionen hängt das von der Einstellung NLS_LENGTH_SEMANTICS ab. Die möglichen Werte sind CHAR und BYTE.

Prüfe:
Code: (dl )
SELECT * FROM NLS_DATABASE_PARAMETERS;


Das kann ansonsten (also unabhängig von der obigen globalen Einstellung) auch per Spalte eingestellt werden:
Code: (dl )
CREATE TABLE [tablename] ([columname] VARCHAR2(2000 CHAR) [, ...]);


Oder man stellt dem DDL-Script voran:
Code: (dl )
ALTER SESSION SET NLS_LENGTH_SEMANTICS = 'CHAR';


Und schließlich kann man die Einstellung auch per Spalte modifizieren:
Code: (dl )
ALTER TABLE [tablename] MODIFY [columname] VARCHAR2(2000 CHAR);


Hiernach kannst Du 2000 Umlaute oder auch kyrillischen oder chinesischen Text in die Spalte schreiben.

Auch wenn der Kunde den Daumen drauf hat: Diese Änderung sollte gemacht (veranlasst) werden. Wenn in einer UTF-8-codierten Datenbank CHAR- oder VARCHAR-Spalten enthalten sind, die potentiell mehrbytige Zeichen enthalten können, ist es eindeutig ein Designfehler, wenn sie NLS_LENGTH_SEMANTICS = 'BYTE' haben.

Grüße
payx
Last edited: 2013-01-30 11:26:21 +0100 (CET)

View full thread Stringlänge ermitteln für ORACLE