leeres Text und Datumsfeld ?

Hallo,

habe mir eben postgreSQL installiert und sitzte nun schon 2 Stunden an einem Problem, was eigentlich keines sein sollte.

Wenn ich per SQL ein Feld vom Typ “text” fülle und die Eingabe in meiner SQL-Anweisung leer ist - also:

INSERT INTO tabelle (meintext) VALUES (’’);

dann wird im Textfeld in der Datenbank folgendes eingetragen: ‘’

Wie kann ich einem Textfeld einen “leeren String” zuweisen ?

Ähnliches Problem mit dem Feld “date”:

Datum im Format ‘0000-00-00’ wird nicht ggriffen. Online habe herausgefunden, dass pgSQL keinen Tag oder Monat “00” als Eingabe zuläßt. Klingt ja noch logisch, aber wie kann ich einen Datensatz per SQL eintragen, wenn ich kein Datum zum dazugehörigen Datensatz habe ??? Das muss doch irgendwie funktionieren …


Kann mir jemand bei meinen beiden Problemchen helfen … dafür wäre ich sehr dankbar …

NULL

Ähnliches Problem mit dem Feld “date”:

Datum im Format ‘0000-00-00’ wird nicht ggriffen. Online habe herausgefunden, dass pgSQL keinen Tag oder Monat “00” als Eingabe zuläßt. Klingt ja noch logisch, aber wie kann ich einen Datensatz per SQL eintragen, wenn ich kein Datum zum dazugehörigen Datensatz habe ??? Das muss doch irgendwie funktionieren …

NULL

Andreas

Da stand ich wohl etwas auf dem Schlauch …

DANKE für die schnelle Antwort !!!

Meinst du einen “leeren String” oder einen NULL-Value? Im Gegensatz zu anderen Datenbanken (-> oracle) unterscheidet Postgresql zwischen diesen beiden!

Zunächst fügt dein Beispiel einen leeren String ein (also insert into … values (’’) macht genau das was du eigentlich willst). Ich nehme an du schaust die Daten über pgadmin3 an. Soweit ich das interpretiere zeigt pgadmin3 die beiden Single-Quotes, um zu verdeutlichen dass es sich um einen “leeren String” handelt.

Eine sichere Faustregel ist: lasse NULL Values in Textfeldern nur in OUTER JOINS auftauchen!

Das war offensichtlich nicht so der Fall.

Ich nehme an du schaust die Daten über pgadmin3 an. Soweit ich das interpretiere zeigt pgadmin3 die beiden Single-Quotes, um zu verdeutlichen dass es sich um einen “leeren String” handelt.

‘’ != NULL

test=*# create table nullen (id serial, t text);
NOTICE:  CREATE TABLE will create implicit sequence "nullen_id_seq" for serial column "nullen.id"
CREATE TABLE
Time: 556.603 ms
test=*# insert into nullen values (default, '');
INSERT 0 1
Time: 1.613 ms
test=*# insert into nullen values (default, NULL);
INSERT 0 1
Time: 1.853 ms
test=*# insert into nullen values (default, 'NULL != 0');
INSERT 0 1
Time: 0.947 ms
test=*# select * from nullen;
 id |     t
----+-----------
  1 |
  2 |
  3 | NULL != 0
(3 rows)

Time: 1.264 ms
test=*# select id, coalesce(t, 'nix') from nullen;
 id | coalesce
----+-----------
  1 |
  2 | nix
  3 | NULL != 0
(3 rows)

Time: 1.698 ms
test=*#

Es gibt durchaus Anwendungen, wo es mehr als sinnvoll ist, zwischen ‘’ und NULL zu unterscheiden. Es ging ja auch nicht nur um Text-Felder.

Eine sichere Faustregel ist: lasse NULL Values in Textfeldern nur in OUTER JOINS auftauchen!

Kannst Du das näher erklären?


Andreas

Verstehe ich das falsch? INSERT INTO

() VALUES (‘’) → fügt einen leeren String ein (nicht NULL, blank, Länge = 0) - wieso war das nicht der Fall? Denn um tatsächlich 2 Singlequotes einzufügen, ist man gezwungen doppelte Singlequotes zu setzen. (‘’‘’)

Um das ging es mir grundlegend ^. Ein leerer String ist nicht NULL - da ein leerer String definiert ist.

Schon klar was hier passiert. Unter pgAdmin3 werden aber tatsächlich ‘’ angezeigt (ich bin mir nicht ganz sicher unter welchen Bedingungen das der Fall war) wenn es sich um einen leeren String (nicht NULL, Blank, Länge=0) - um eben zu verdeutlichen, dass es ein leerer String ist und nicht etwa NULL.

Nichts anderes habe ich gesagt - ich würde sogar formulieren: unter pgsql kommt man gar nicht drumherum zwischen beiden zu unterscheiden (was Text-Typen angeht)

Da NULL ein “nicht definierter Wert” ist hat dieser en Nachteil, dass sämtliche darauf angewendete Funktionen und Operatoren NULL zurückliefern (ich lasse jetzt mal COALESCE, Is Null usw. beiseite). Wenn man das nicht wirklich beabsichtigt, sehe ich keinen Grund in irgendeinem Textfeld ein NULL stehen zu lassen. Konfuser wird es, wenn man sich dessen nicht bewußt ist - dann sucht man sich im Zweifelsfall nen heißen Reifen, wenn etwas Unerwartetes passiert. Und das wird aus erstgenannten Gründen definitiv passieren.

Natürlich bleibt bei allen Übrigen Datentypen nichts anderes Übrig als NULL stehen zu lassen. Aber das fällt einem schon eher auf da 0 ganz offensichtlich etwas anderes meint als NULL.