Leeres Feld wird nicht als solches interpretiert

Programmierung mit PostgreSQL (C#, PHP, Perl, Java, ...)

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.
shitake83
Neuer Benutzer
 
Beiträge: 27
Registriert: Do 18. Nov 2010, 16:10
Wohnort: ASSINDIA

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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

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, 16:10
Wohnort: ASSINDIA

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.
shitake83
Neuer Benutzer
 
Beiträge: 27
Registriert: Do 18. Nov 2010, 16:10
Wohnort: ASSINDIA

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
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD


Zurück zu Programmierung

Wer ist online?

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

cron