Hibernate, Oracle, Codepage


#1

Hallo,

wer macht die Codepageumrubbelung wenn man via Hibernate ein Objekt mit einem Javastring (der Max-Länge 255) in eine Oracle-Tabelle mit einem Varchar(2) der Länge 255 ballert?
Wie die Oracle konfiguriert ist, weiss ich nicht. (müsste ich über Umwegen in Erfahrung bringen).
Die Hibernate-Config ist ohne explizite Codepage. Was wird da genommen? System?

Problem ist dass der String kleiner als 255 ist, aber ORACLE meckert, dass er 260 lang ist. Anscheind wird er in UFT-8 gewandelt?
Wer macht das?
Das ist gerade eine Blackbox bei mir.

Gruß Thomas


#2

keine genaue Antwort, aber womöglich hilfreiche Hinweise:

teste doch erstmal was gespeichert wird:
nimm 10 Zeichen weg, speichere also 245, ist die Länge in der DB ~250, length()-Funktion?

schau dir genau an welche 250 Zeichen, soweit möglich, oder sind komplizierte unsichtbare wie Tab/ Zeilenumbruch dabei?,
gerade Zeilenumbruch kann ja mal
, mal
sein, ein oder zwei Zeichen

vergleiche mit Länge in Java an klar definierten Grenzen,
frage ggfs. einzelne Chars in einer Schleife ab von Java aus, wenn in DB nicht so genau darzustellen, oder geht dort Umwandlung in int?


#3

Die Codepage sollte von JDBC gesetzt werden, welches Setup hast du? Standalone Anwendung oder Applicationserver mit Datasource?

Bei Oracle ist VARCHAR(256) aber auch nicht gleich VARCHAR(256): Hier unterscheidet Oracle zwischen VARCHAR(256 BYTE) und VARCHAR(256 CHARACTER). Das Problem hatte ich auch erst letztens, diese Erklärung hat mir sehr geholfen: sql - Difference between BYTE and CHAR in column datatypes - Stack Overflow

VARCHAR(256 CHARACTER) erlaubt dir, 256 Zeichen zu speichern, das sollte der Datentyp sein den du möchtest. VARCHAR(256 BYTE) erlaubt dir 256 Byte zu speichern, 1 Unicode Character kann aber mehr als 1 Byte belegen. “regenbogen” hat nur ‘normale’ Character aus dem ASCII Raum, 10 Zeichen = 10 Byte. ‘Überrollbügel’ hat 13 Characters und 15 Bytes.

BYTE ist das Default Verhalten, ich würde also davon ausgehen dass die Column nur mit VARCHAR(256) ohne weiteren Bezeichner erstellt wurde.