Leeres Feld wird nicht als solches interpretiert

Programmierung mit PostgreSQL (C#, PHP, Perl, Java, ...)
shitake83
Neuer Benutzer
Beiträge: 27
Registriert: Do 18. Nov 2010, 15:10
Wohnort: ASSINDIA
Kontaktdaten:

Leeres Feld wird nicht als solches interpretiert

Beitragvon shitake83 » Di 13. Sep 2011, 13:30

Hallo,

ich habe eine Java Anwendung die auf eine Postgresql Datenbank zugreift. Soweit klappt auch alles wunderbar, nur laufe ich aktuell in einen unschönen Fehler. Ich habe ein Feld 'PLZ' (Character 5) in meiner Tabelle, das manchmal auch leer sein kann. Das versuche ich in Java zu überprüfen und weiter zu behandeln.

Code: Alles auswählen

 if(plz == " '' " ){System.out.println("plz is empty");}
else if(plz == "" ){System.out.println("plz is empty");}
else if(plz == NULL ){System.out.println("plz is empty");}


Keine der Abfragen erzielt ein Ergebnis, wenn ich mir die Tabelle jedoch in Postgres anschaue bzw. das Feld anklicke, dann habe ich 5 Blanks in dem Feld stehen, die aber durch eine Abfrage nicht zu "bekommen" sind, sondern das Feld ist für die Datenbank leer

Code: Alles auswählen

select * from myTable where plz = ''
gibt mir exakt alle Felder deren PLZ leer ist, die aber an Java übergeben 5 blanks haben, auf die ich aber nicht überprüfen kann. ^^ Unglaublich aber wahr, ich prüfe in der Datenbank ob 'Feld n' leer ist und kriege True als Antwort, wenn ich jedoch dasselbe Feld dann in meinem Resultset in Java auf leere überprüfe, kriege ich als Antwort False (bzw. Feld nicht leer).

Ich habe mir auch den Bytewert der Felder in Java mal anzeigen lassen und dachte das womöglich alle Felder die "leer" sind wenigstens dieselbe Bytefolge haben, dies war auch nicht der Fall. Ich hatte jedesmal anderen "Datenmüll".

Stell ich mich einfach nur Dumm an oder wo ist mein Denk/Programmierfehler hier bei der Sache.

Vielen Dank für Hilfe.

akretschmer
Erfahrener Benutzer
Beiträge: 7035
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitragvon akretschmer » Di 13. Sep 2011, 13:38

shitake83 hat geschrieben:Hallo,

ich habe eine Java Anwendung die auf eine Postgresql Datenbank zugreift. Soweit klappt auch alles wunderbar, nur laufe ich aktuell in einen unschönen Fehler. Ich habe ein Feld 'PLZ' (Character 5) in meiner Tabelle, das manchmal auch leer sein kann. Das versuche ich in Java zu überprüfen und weiter zu behandeln.

Code: Alles auswählen

 if(plz == " '' " ){System.out.println("plz is empty");}
else if(plz == "" ){System.out.println("plz is empty");}
else if(plz == NULL ){System.out.println("plz is empty");}


Keine der Abfragen erzielt ein Ergebnis, wenn ich mir die Tabelle jedoch in Postgres anschaue bzw. das Feld anklicke, dann habe ich 5 Blanks in dem Feld stehen, die aber durch eine Abfrage nicht zu "bekommen" sind, sondern das Feld ist für die Datenbank leer

Code: Alles auswählen

select * from myTable where plz = ''
gibt mir exakt alle Felder deren PLZ leer ist, die aber an Java übergeben 5 blanks haben, auf die ich aber nicht überprüfen kann. ^^ Unglaublich aber wahr, ich prüfe in der Datenbank ob 'Feld n' leer ist und kriege True als Antwort, wenn ich jedoch dasselbe Feld dann in meinem Resultset in Java auf leere überprüfe, kriege ich als Antwort False (bzw. Feld nicht leer).

Ich habe mir auch den Bytewert der Felder in Java mal anzeigen lassen und dachte das womöglich alle Felder die "leer" sind wenigstens dieselbe Bytefolge haben, dies war auch nicht der Fall. Ich hatte jedesmal anderen "Datenmüll".

Stell ich mich einfach nur Dumm an oder wo ist mein Denk/Programmierfehler hier bei der Sache.

Vielen Dank für Hilfe.


Ein == NULL funktioniert nicht, verwende isnull() dafür.

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

shitake83
Neuer Benutzer
Beiträge: 27
Registriert: Do 18. Nov 2010, 15:10
Wohnort: ASSINDIA
Kontaktdaten:

Beitragvon shitake83 » Di 13. Sep 2011, 13:41

Danke für die schnelle Antwort.
Ich habe gerade nochmal mit isnull() geprüft und kein True gekriegt.
Ich habe mir die Länge mal angeben lassen

Code: Alles auswählen

System.out.println("The length of plz is: "+ dbSet[2].length());

Und die Antwort war 5.
Wenn ich aber mit einer Variable die 5 Blanks enthält gegenprüfe kriege ich auch nicht True.
Ich verzweifel.

shitake83
Neuer Benutzer
Beiträge: 27
Registriert: Do 18. Nov 2010, 15:10
Wohnort: ASSINDIA
Kontaktdaten:

Beitragvon shitake83 » Di 13. Sep 2011, 14:15

Die Antwort ist :

Code: Alles auswählen

String str = "     ";
if(dbSet[2].equals(str)){System.out.println("plz is empty");}

Keine wirklich schöne Lösung, aber sie funktioniert.

Der Grund wieso ein

Code: Alles auswählen

if(dbSet[2] == str){System.out.println("plz is empty");}

[/CODE]
nicht dasselbe Ergebnis liefert findet man hier: Java Blog Buch : 03.02 Strings vergleichen

Die einzige Sache die sich mir noch nicht erschlossen hat, ist wieso die Datenbank ein leeres Feld, welches als Character(5) eingestellt ist, als String mit 5 (leeren) Zeichen zurückgibt.

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitragvon ads » Di 13. Sep 2011, 21:41

Wenn du das Feld als CHAR(5) definierst, dann sagst du der Datenbank, das du eine feste Länge von 5 Zeichen haben willst.
Demzufolge bekommst du 5 Leerzeichen zurück.

Wenn du VARCHAR(5) sagst, werden Leerzeichen am Ende abgeschnitten.

Intern werden Leerzeichen am Ende nicht mitgespeichert, aber bei CHAR werden die Leerzeichen vor der Ausgabe noch aufgefüllt.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support


Zurück zu „Programmierung“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste