Ergebnis 1 bis 7 von 7

Thema: leeres Text und Datumsfeld ?

  1. #1
    ruehau ist offline Neuer Benutzer
    Registriert seit
    20.01.2007
    Beiträge
    2

    Standard 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 ...

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ruehau Beitrag anzeigen
    Hallo,


    Wie kann ich einem Textfeld einen "leeren String" zuweisen ?
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    ruehau ist offline Neuer Benutzer
    Registriert seit
    20.01.2007
    Beiträge
    2

    Standard Ok ...

    Da stand ich wohl etwas auf dem Schlauch ...

    DANKE für die schnelle Antwort !!!

  4. #4
    pepperbob ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    28

    Standard

    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!

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von pepperbob Beitrag anzeigen
    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).
    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

    Code:
    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
    Geändert von akretschmer (22.01.2007 um 21:30 Uhr)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    pepperbob ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    28

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Das war offensichtlich nicht so der Fall.
    Verstehe ich das falsch? INSERT INTO <table>(<textfeld>) 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. ('''')

    Zitat Zitat von akretschmer Beitrag anzeigen
    '' != NULL
    Um das ging es mir grundlegend ^. Ein leerer String ist nicht NULL - da ein leerer String definiert ist.

    Zitat Zitat von akretschmer Beitrag anzeigen
    Code:
    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=*#
    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.

    Zitat Zitat von akretschmer Beitrag anzeigen
    Es gibt durchaus Anwendungen, wo es mehr als sinnvoll ist, zwischen '' und NULL zu unterscheiden. Es ging ja auch nicht nur um Text-Felder.
    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)

    Zitat Zitat von akretschmer Beitrag anzeigen

    Kannst Du das näher erklären?


    Andreas
    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.

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von pepperbob Beitrag anzeigen
    Verstehe ich das falsch? INSERT INTO <table>(<textfeld>) VALUES ('') -> fügt einen leeren String ein (nicht NULL, blank, Länge = 0) - wieso war das nicht der Fall?
    Der OP wollte, um es banal zu sagen, NIX einfügen. Es ist aber ein Unterschied, ob ich wirklich NIX einfüge oder sage: der eingefügte String hat die Länge 0.

    Denn um tatsächlich 2 Singlequotes einzufügen, ist man gezwungen doppelte Singlequotes zu setzen. ('''')
    Wowereit!

    Um das ging es mir grundlegend ^. Ein leerer String ist nicht NULL - da ein leerer String definiert ist.
    Worüber reden wir dann?

    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.
    Ich nix PGAdmin.

    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)
    Fein. Sind wir uns also einig.

    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.
    Aha.


    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

Ähnliche Themen

  1. Problem Leeres Feld wird nicht als solches interpretiert
    Von shitake83 im Forum Programmierung
    Antworten: 4
    Letzter Beitrag: 13.09.2011, 21:41
  2. Suchen in einem Datumsfeld
    Von burkhard im Forum Allgemeines
    Antworten: 6
    Letzter Beitrag: 21.07.2010, 19:15
  3. Frage Text hinter vorhandenen Text in Spalte setzten
    Von tigerkne im Forum SQL
    Antworten: 1
    Letzter Beitrag: 06.11.2008, 10:53
  4. geometrytyp 'text'
    Von rs_II im Forum PostGIS
    Antworten: 4
    Letzter Beitrag: 07.05.2007, 10:37
  5. pg_dump erzeugt immer eine leeres Backup
    Von NixChecker im Forum PL/pgSQL
    Antworten: 11
    Letzter Beitrag: 26.01.2006, 19:50

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum