Character.MIN_VALUE

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich habe in meiner JPA-Entitätsklasse ein Attribut mit dem Datentyp Character definiert.

Wenn ich diesem Attribut den Wert von Character.MIN_VALUE zuweise, kriege ich in der DB-Tabelle angezeigt:
00

Warum ist das so? Ich dachte, der Wert von Character.MIN_VALUE sei 0?

Hat dies mit dem Mapping auf den Datentyp von der Datenbank zu tun?

Vielen Dank für die Kommentare.

Viele Grüße aus Rheinland,

Eure Ratna
 

oraclin25

Erfahrenes Mitglied
Hallo Klaus,

vielen Dank für die Antwort erstmal. Ich habe nämlich folgendes in meiner JPA-Entitätsklasse definiert:

Code:
    @XmlElement(name = "Ratna")
    @XmlJavaTypeAdapter(MeinAdapter.class)
    @Column(name = "RATNA")
    private Character ratna;

Ich arbeite zwischen XML <--> Java. Auf dem Weg zur Java-Welt stelle ich sicher, dass für die Variable ratna immer Character.MIN_VALUE rauskommt, indem ich eine Adapaterklasse baue und darin folgendes mache:
Code:
public class MeinAdapter extends XmlAdapter<String, Character> {
    @Override
    public Character unmarshal(String v) throws Exception {
        return Character.MIN_VALUE;
    }
....

Auf der JRE hat Java für die Variable ratna also den Wert Character.MIN_VALUE in der Hand, nämlich die 0.

Nun speichere ich ab in die Tabellenspalte RATNA.

Ich sehe als Ergebnis der Speicherung ein leeres Kästchen statt die 0.

Dabei habe ich die Spalte so definiert:
Code:
...
RATNA    char(1),
...

Warum eigentlich? Ich bin mir sicher, dass die Datenbank den Wert Character.MIN_VALUE binär interpretiert hat, warum auch immer.

Och je, ich hoffe, meine Beschreibung ist verständlich?

Vielen Dank.

Viele Grüße aus Rheinland,

Eure Ratna
 

vfl_freak

Premium-User
Moinsen,

ich bin jetzt etwas verwirrt!
Eingangs hast Du geschrieben, Du siehst '00', jetzt ist es plötzlich 'ein leeres Kästchen ...
BTW: von welcher DB reden wir überhaupt ??

Gruß Klaus
 

oraclin25

Erfahrenes Mitglied
Hallo Klaus,

stimmt, sorry, ich habe vergessen hinzuzufügen, dass wenn ich versuche
select hex(ratna) from meinetabelle;
dann erhalte ich 00

Diese 00 ist also die hexadeziale Darstellung von dem leeren Kästchen.

Ich habe zwar nirgendswo gesehen, dass man Character also Datentyp in einem Entittäsklassenattribut nimmt, aber ich dachte, es muss doch möglich sein? Zumal, String ist ja auch nichts anderes als eine Folge von Chracter.

Viele Grüße aus Rheinland,

Eure Ratna
 

oraclin25

Erfahrenes Mitglied
Hallo Klaus,

nachdem ich mir das Thema im Google angeguckt habe, hab ich glaub jetzt den Dreh.
Character.MIN_VALUE ist nämlich die hexadezimale Darstellung von dem "untersten" Zeichen für Java; dieses Zeichen ist nicht ausdruckbar, deshalb sieht man auf der DB ein leeres Kästchen(bzw. die DB interpetriert dieses Zeichen als leeres Kästchen)

Java speichert INTERN ein Zeichen generell erstmal in einer 16er-Bit-Form. Es gibt aber Zeichen, die "mehr brauchen". Hierzu hat Java aber Methode(n), die diese Zeichen trotzdem darstellen können(und zwar mit mehr als 16 Bits). Diese Details interessieren uns Entwicklerinnen aber nicht. Wir wissen nur, dass Java jedenfalls ALLE ASCII-Zeichen darstellen bzw. verarbeiten kann.

Eine wichtige Erkenntnis für mich geworden ist, dass diese 16-Bit-Darstellung mit Encoding eines Files aber auch gar nichts zu tun. Das eine ist für Java, wie er das File zu lesen hat(mit welchem Encoding, meist ist es UTF-8). Das andere ist seine interne Repräsentation jedes einzelnen Zeichens.

Mich hat das ganze Thema UTF-8 UTF-16 sowieso schon verwirrt. Aber jetzt ist zumindest etwas klarer geworden.

Vielen Dank Klaus.

Viele Grüße aus Rheinland,

Eure Ratna
 

sheel

I love Asm
Character.MIN_VALUE ist nämlich die hexadezimale Darstellung
Nop. Character.MIN_VALUE ist einfach der Wert, der beliebig dargestellt werden kann (wenns hex ist liegt das nur am Ausgabecode, nicht am Wert).. Aber ja, das ist ein Zeichen, das nicht als Text gedacht ist, und für normale Textspalten in der DB nicht wirklich geeignet.

Und ja, Java speichert seine Variablen intern als UTF16 (pro Zeichen 2 oder 4 Byte, je nach Zeichen), auch wenn die Datei, die man eingelesen hat, nciht UTF16 war. Wird dann während dem Einlesen eben umgerechnet.

(Dein Beitrag hat in mir die Idee wieder aufleben lassen, endlich einmal ein Tutorial über Zeichensätze zu schreiben :D)
 

oraclin25

Erfahrenes Mitglied
Hallo sheel,

stimmt, Character.MIN_VALUE ist nicht die hexadezimale Darstellung, sondern eher an ASCI-Konvention gelehnte Darstellung:
Character.MIN_VALUE = '\u0000';

Jaaaaa sheel, schreib mal bitte das Tutorial über Zeichensätze. Würde mich freuen.

Viele Grüße aus Rheinland,

Eure Ratna
 

sheel

I love Asm
sondern eher an ASCI-Konvention gelehnte Darstellung:
Character.MIN_VALUE = '\u0000';
:eek:
Wo hast du denn das wieder her? :D
Es ist ganz einfach 0, ganz egal in welcher Darstellung.
Deine Schreibweise ist ja auch nur eine von vielen.

Tutorial: Werd ich :)
(Nur wann? :eek: Die Woche komm ich sicher zu nichts, soviel steht fest)