Stefan: 0 oder NULL? Was ist richtig?

Hallo,

ich habe mir in den letzten Tagen häufiger die Frage gestellt, ob man bei MySQL-Datenbanken die Spalten, die keinen Inhalt haben, mit NULL oder 0 ausfüllen sollte. Bisher habe ich leere Spalten immer mit der Zahl 0 ausgefüllt, damit ich immer einen einheitlichen Wert habe, wenn es um das Verarbeiten der Datenbankeinträge geht.

Vieleicht kann jemand von euch Licht ins Dunkle bringen. Würde mich über eine Antwort freuen.

gruß Stefan

  1. Hi!

    Fuer 'nicht vorhanden' gibt es NULL. fuer den Wert 0 gibts die 0... Was auf deine Tabellen zutrifft, kann ausser Dir im Moment keiner sagen.

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. yo,

      Fuer 'nicht vorhanden' gibt es NULL. fuer den Wert 0 gibts die 0... Was auf deine Tabellen zutrifft, kann ausser Dir im Moment keiner sagen.

      NULL steht eher für nicht definiert, sprich dass man keine aussage treffen kann. und auch genauso würde ich es auch verwenden. "nicht vorhanden" ist eine information und kann dich in schwierigkeiten bringen, wenn du zwischen den beiden unterscheiden musst.

      Ilja

      1. Hallo,

        Ist ein  'nicht vorhanden' gleich zu setzen mit einem leeren String? (also '')

        gruß Stefan

        1. Mahlzeit Stefan,

          Ist ein  'nicht vorhanden' gleich zu setzen mit einem leeren String? (also '')

          Nein, wieso sollte es?

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        2. Hallo,

          Ist ein  'nicht vorhanden' gleich zu setzen mit einem leeren String? (also '')

          das hängt davon ab, das hängt auch vom Datentyp der Spalte ab, siehe die Beispiele von Sven und Rouven im von Paul verlinkten Thread:

          Regelmäßige Temperaturmessung, Temperaturspalte hat numerischen Datentyp. => Messwert nicht vorhanden wird durch NULL signalisiert. Es ist ganz bestimmt *nicht* sinnvoll, den Wert 0 für nicht vorhanden zu nutzen :-)

          Telefonnummer (Zeichenketten-Datentyp):
          a) unbekannt, ob Person Telefon hat, bzw. vorhandene unbekannt: NULL
          b) Person hat kein Telefon, d.h. nicht vorhanden: Leerstring
          c) Person hat Telefonnummer: entsprechender Wert.

          Freundliche Grüße

          Vinzenz

        3. yo,

          Ist ein  'nicht vorhanden' gleich zu setzen mit einem leeren String? (also '')

          für "nicht vorhanden" muss je nach datentyp ein entsprechender wert gefunden werden. dazu wir oftmals der NULL wert benutzt. davon würde ich dringend abraten.

          Ilja

          1. Hi!

            für "nicht vorhanden" muss je nach datentyp ein entsprechender wert gefunden werden. dazu wir oftmals der NULL wert benutzt. davon würde ich dringend abraten.

            Dann gib doch mal nen Tipp, was man nehmen sollte fuer die Spalte, in der die Zahl gespeichert wird, die jemand eintragen sollte, wenn er keine eingetragen hat, also keine vorhanden ist.

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
            1. yo,

              Dann gib doch mal nen Tipp, was man nehmen sollte fuer die Spalte, in der die Zahl gespeichert wird, die jemand eintragen sollte, wenn er keine eingetragen hat, also keine vorhanden ist.

              das ist wie mit daten-design und hängt somit sehr stark vom speziellen fall ab. werden zum beispiel die hubraumwerte eines motors gespeichert, könnte man eine -1 nehmen. läßt einen der zahlenraum keine solche möglichkeit, kann man dies sogar notfalls in einer anderen spalte persistieren.

              Ilja

              1. yo,

                hatte natürlich noch die 0 vergessen, die oftmals eingesetzt werden kann, wenn was nicht vorhanden ist, zum beispiel wenn dinge gelagert werden. also wie gesagt, wo und wie ich diese information speicher, dass ist stark abhängig von dem jeweiligen fall.

                Ilja

                1. Mahlzeit Ilja,

                  hatte natürlich noch die 0 vergessen, die oftmals eingesetzt werden kann, wenn was nicht vorhanden ist, zum beispiel wenn dinge gelagert werden.

                  Wenn Du den Bestand als numerischen Wert speicherst, dann haben 9 und NULL eine unterschiedliche Aussage: 0 bedeutet, dass kein Exemplar im Bestand ist - NULL bedeutet, dass kein Bestand ermittelt werden konnte bzw. nicht bekannt ist, wie hoch der Bestand ist.

                  also wie gesagt, wo und wie ich diese information speicher, dass ist stark abhängig von dem jeweiligen fall.

                  Richtig. Trotzdem besitzt NULL eine andere Aussagekraft als 0 bei numerischen Werten bzw. '' bei Zeichenketten.

                  MfG,
                  EKKi

                  --
                  sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  1. yo,

                    0 bedeutet, dass kein Exemplar im Bestand ist - NULL bedeutet, dass kein Bestand ermittelt werden konnte bzw. nicht bekannt ist, wie hoch der Bestand ist.

                    genauso sehe ich das auch, bei 0 kann ich eine aussage treffen, bei NULL eben nicht mehr.

                    Richtig. Trotzdem besitzt NULL eine andere Aussagekraft als 0 bei numerischen Werten bzw. '' bei Zeichenketten.

                    naja, hatte es schon im anderen beitrag geschrieben NULL ist gleich '' bei oracle, also aufpassen...

                    Ilja

                    1. Mahlzeit Ilja,

                      naja, hatte es schon im anderen beitrag geschrieben NULL ist gleich '' bei oracle, also aufpassen...

                      Mit Verlaub, das ist Blödsinn. Wir nutzen hier Oracle 10g, und da besteht sehr wohl ein Unterschied zwischen NULL und '' ...

                      MfG,
                      EKKi

                      --
                      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                      1. yo,

                        Mit Verlaub, das ist Blödsinn. Wir nutzen hier Oracle 10g, und da besteht sehr wohl ein Unterschied zwischen NULL und '' ...

                        hast du mal in einer test-tabelle in einer VARCHAR2 spalte einen wert mit NULL und einen wert mit '' eingefügt und dann mit IS NULL abgefragt, welche datensätze das betrifft ?

                        Ilja

                        1. Mahlzeit Ilja,

                          hast du mal in einer test-tabelle in einer VARCHAR2 spalte einen wert mit NULL und einen wert mit '' eingefügt und dann mit IS NULL abgefragt, welche datensätze das betrifft ?

                          Bisher noch nicht - und ich bin auch nicht berechtigt, neue Tabellen bzw. neue Spalten anzulegen. Aber vielleicht finde ich ja mal eine entsprechende Tabelle mit entsprechenden Spalten, in der sich ein paar Datensätze befinden, die ich zum Testen mal abfragen könnte ...

                          MfG,
                          EKKi

                          --
                          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                          1. yo,

                            Bisher noch nicht - und ich bin auch nicht berechtigt, neue Tabellen bzw. neue Spalten anzulegen.

                            hmm, du meinst das mit dem NULL und '' ist blödsinn was ich sage und hast keine möglichkeit, es zu testen ? wie bist du darauf gekommen, dass es nicht stimmt ?

                            Ilja

                            1. Mahlzeit Ilja,

                              hmm, du meinst das mit dem NULL und '' ist blödsinn was ich sage und hast keine möglichkeit, es zu testen ?

                              Ich konnte den von Dir geschilderten Fall explizit so nicht abbilden, das ist richtig.

                              wie bist du darauf gekommen, dass es nicht stimmt ?

                              Weil ich bisher bestens damit arbeiten konnte ... allerdings kann das auch am manchmal recht eigenwilligen Verhalten unseres Datenbanktreibers liegen.

                              Ich habe jetzt mal in einer Tabelle einige Datensätze mit einer VARCHAR2-Spalte miteinander verglichen: einige hatten dort Inhalte und bei zweien haben ich einmal explizit NULL und einmal explizit einen leeren String eingetragen ... bei der Abfrage auf IS NULL werden mir beide angezeigt - selbst wenn ich den leeren String explizit per to_char() als String caste.

                              Dieses Phänomen war mir bisher nicht bewusst ... in dem Fall gebe ich Dir recht, dass Oracle absoluter Bockmist ist. Eine Spalte, die sowohl Inhalte als auch den Wert NULL enthalten darf, muss dann eben auch alle möglichen Inhalte entgegennehmen - und nicht lustig in den Werten herumkonvertieren. Das ist ja schlimmer als sämtliche variablentypenlose Skriptsprachen!

                              Ich glaube, ich muss mich in einer ruhigen Minute nochmal mit unseren Datenbankmaschinisten unterhalten ...

                              MfG,
                              EKKi

                              --
                              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                              1. yo,

                                Dieses Phänomen war mir bisher nicht bewusst ... in dem Fall gebe ich Dir recht, dass Oracle absoluter Bockmist ist.

                                hmm, du bist wieder schnell mit deinen urteilen. erst war meine aussage blödsinn, nun macht oracle bockmist. ich würde erst mal abwarten, hat vielleicht auch vorteile...

                                Eine Spalte, die sowohl Inhalte als auch den Wert NULL enthalten darf, muss dann eben auch alle möglichen Inhalte entgegennehmen

                                die frage ist doch, was ist '' für ein wert/inhalt ?

                                Ich glaube, ich muss mich in einer ruhigen Minute nochmal mit unseren Datenbankmaschinisten unterhalten ...

                                mach das, unterhalten ist immer gut und das noch besser bei einem bier. aber wie gesagt, nicht so schnell ziehen cowboys mit dem colt.....

                                Ilja

                                1. Yerf!

                                  hmm, du bist wieder schnell mit deinen urteilen.

                                  An der Stelle muss ich mich aber auf die Seite von EKKi stellen.

                                  erst war meine aussage blödsinn, nun macht oracle bockmist.

                                  Ich konnte es auch erst nicht glauben, dass Oracle so einen "Bockmist" macht, habs aber hier bei mir auch nachvollziehen können.

                                  ich würde erst mal abwarten, hat vielleicht auch vorteile...

                                  Vermutlich genauso viel, wie das Selektieren nichtgruppierter Spalten bei MySQL: im überwiegenden Teil der Fälle führt es zu nicht erwarteten Fehlverhalten.

                                  die frage ist doch, was ist '' für ein wert/inhalt ?

                                  Ein Wert über den die Aussage getroffen werden kann, dass er leer ist. Im Gegensatz dazu ist NULL ein Wert über den keine Aussage getroffen werden kann.

                                  Ist für mich wie bei Programmiersprachen: ein Null-Pointer ist noch nicht initialisiert, ein Leerstring zeigt aber auf einen definierten inhalt (in C z.B. auf ein Char-Array mit einem Byte Inhalt: '\0')

                                  Gruß,

                                  Harlequin

                                  --
                                  <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                                  1. 你好 Harlequin,

                                    Ist für mich wie bei Programmiersprachen: ein Null-Pointer ist noch nicht initialisiert, […]

                                    Doch, ein NULL-Pointer wurde initialisiert :) Nämlich mit NULL. Ansonsten wäre sein Wert undefiniert (siehe dein Beispiel mit C).

                                    再见,
                                     克里斯蒂安

                                    --
                                    http://wwwtech.de/
                                    IRC-Clients und Irssi-Scripting | Flyspray
                                    Wer sich zu überschwänglich freut, wir später Grund zum Weinen haben.
                                    1. Yerf!

                                      » Ist für mich wie bei Programmiersprachen: ein Null-Pointer ist noch nicht initialisiert, […]

                                      Doch, ein NULL-Pointer wurde initialisiert :) Nämlich mit NULL. Ansonsten wäre sein Wert undefiniert (siehe dein Beispiel mit C).

                                      Äh... stimmt! Der Pointer ist initialisiert, aber das wohin er zeigt nicht und das ist das eigentlich Interessante (deswegen auch die Ausführung mit dem Leerstring)

                                      Gruß,

                                      Harlequin

                                      --
                                      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
          2. Hi,

            für "nicht vorhanden" muss je nach datentyp ein entsprechender wert gefunden werden. dazu wir oftmals der NULL wert benutzt. davon würde ich dringend abraten.

            für "nicht vorhanden" gibt es in Datenbanken exakt einen Wert. Er lautet NULL. Alles andere ist grob fahrlässig.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. yo,

              für "nicht vorhanden" gibt es in Datenbanken exakt einen Wert. Er lautet NULL. Alles andere ist grob fahrlässig.

              muss letzich jeder selbst wissen, wie er diese Information abspeichern will. ich spreche auch nur für den kontext datenbanken und nicht allgemein für NULL (wobei meines wissen NULL im zusammenhang mit rdbms eingeführt wurde). aber entscheidend ist, es ist eine zusätzliche info, die aus meiner sicht mit dem NULL wert nichts zu tun hat. NULL steht dafür, dass man keine aussage treffen kann und "nicht vorhanden" ist mal ganz sicher eine aussage(Info).

              wenn man NULL als "nicht vorhanden" nimmt, hast du keine möglichkeit mehr, zwischen der eigentlichen funktion, nämlich keine aussage darüber treffen zu können, zu unterscheiden. gerne gebe ich dir dazu ein beispiel.

              eine dba/entwickler geht die kundentabelle durch und stellt fest, dass bei einigen die e-mail adresse fehlt. da aber die firma für die zukunft plant, zusätzliche infos und angebote auch per e-mail zu verschicken, druckt er eine liste der kunden aus, die dann von einem mitarbeiter angerufen werden sollen. erklärt sich der kunde bereit, diese zusätzlichen service wahrzunehmen, trägt der mitarbeiter die neue e-mail adresse ein. ist der kunde dazu nicht bereit oder kann der kunde nicht erreicht werden, trägt er nichts ein.

              der dba/entwickler prüft am ende der woche, bei wievielen der kunden immer noch die e-mail adresse fehlt. inzwischen sind es auch deutlich weniger (der mitarbeiter war fleissig). also druckt er die jetzt kleinere liste für die nächste woche aus und gibt sie wieder dem mitarbeiter. kurze zeit später klopft der mitarbeiter an die tür und beklagt sich, dass er nun kunden doppelt anruft und die kunden sich dadurch genervt fühlen...

              den rest kannst du dir selbst denken, du wirst keine chance haben, die NULL werte aufzuteilen in "schon angerufen will aber nicht oder hat keine e-mail" und zwischen denen, "die noch nicht erreicht werden konnten".

              Ilja

              1. 你好 Ilja,

                der dba/entwickler prüft am ende der woche, bei wievielen der kunden immer noch die e-mail adresse fehlt. inzwischen sind es auch deutlich weniger (der mitarbeiter war fleissig). also druckt er die jetzt kleinere liste für die nächste woche aus und gibt sie wieder dem mitarbeiter. kurze zeit später klopft der mitarbeiter an die tür und beklagt sich, dass er nun kunden doppelt anruft und die kunden sich dadurch genervt fühlen...

                In diesem Fall muss unterschieden werden zwischen „nicht vorhanden“ (aka NULL) und „nicht angegeben“ (repräsentiert z. B. durch einen Leerstring). Oder, wie wir es hier in der Firma machen, allerdings aus anderen Gründen, denn genau das ist unsere Dienstleistung, man führt eine Anrufliste, in der so was protokolliert wird.

                再见,
                 克里斯蒂安

                --
                http://wwwtech.de/
                IRC-Clients und Irssi-Scripting | Flyspray
                Mensch zu Mathematiker: "Ich finde Ihre Arbeit ziemlich monoton". Mathematiker: "Mag sein! Dafür ist sie aber stetig und unbeschränkt."
                1. yo,

                  In diesem Fall muss unterschieden werden zwischen „nicht vorhanden“ (aka NULL) und „nicht angegeben“ (repräsentiert z. B. durch einen Leerstring). Oder, wie wir es hier in der Firma machen, allerdings aus anderen Gründen, denn genau das ist unsere Dienstleistung, man führt eine Anrufliste, in der so was protokolliert wird.

                  wird dir wenig nützen, solange du NULL für "nicht vorhanden" einsetzt. dies ist eine mehrinfo, die ich über den kunden habe und ich sollte sie entsprechend festhalten und zwar genau nicht mit NULL. und bei einem leerstring (im sinne von '') musst du auch aufpassen, der wird zum beispiel in Oracle als NULL interpertiert.

                  das alles damit zu regeln, dass ich die liste auf papier für alle zeiten aufbewahren muss, dass halte ich auch für wenig geschickt. dann habe ich ja keine möglichkeit per sql abfrage zu überprüfen, wer wurde schon angerufen und wer nicht (eventuell auch mit datum persisitieren und wer nicht).

                  mein grundsatz ist, NULL hat keine (und zwar wirklich gar keine) aussagekraft und damit liegt man eigentlich nie falsch. alles weitere kann dich nur von einer eventualität in die andere bringen. wenn ich informationen über den kunden gewinne und diese auch benötige, würde ich sie explizit speichern und nicht in einem NULL wert "verstecken".

                  Ilja

                  1. 你好 Ilja,

                    In diesem Fall muss unterschieden werden zwischen „nicht vorhanden“ (aka NULL) und „nicht angegeben“ (repräsentiert z. B. durch einen Leerstring). Oder, wie wir es hier in der Firma machen, allerdings aus anderen Gründen, denn genau das ist unsere Dienstleistung, man führt eine Anrufliste, in der so was protokolliert wird.

                    wird dir wenig nützen, solange du NULL für "nicht vorhanden" einsetzt.

                    Was genau? Du hast da zwei Möglichkeiten zitiert. Das mitprotokollieren von Anrufen? Doch, das nützt mir und funktioniert seit 4 Jahren auch sehr gut :)

                    dies ist eine mehrinfo, die ich über den kunden habe und ich sollte sie entsprechend festhalten und zwar genau nicht mit NULL. und bei einem leerstring (im sinne von '') musst du auch aufpassen, der wird zum beispiel in Oracle als NULL interpertiert.

                    Noch ein Grund, kein Oracle einzusetzen ;>

                    das alles damit zu regeln, dass ich die liste auf papier für alle zeiten aufbewahren muss, dass halte ich auch für wenig geschickt.

                    Das ist Blödsinn, ja: dann kann ich ja gleich wieder Karteikarten einsetzen.

                    mein grundsatz ist, NULL hat keine (und zwar wirklich gar keine) aussagekraft und damit liegt man eigentlich nie falsch.

                    Naja, sei mir nicht bös, aber das ist doch einfach nicht wahr. Welche Aussagekraft NULL hat, ist eine reine Definitionsfrage. Wenn ich für meine Applikation definiere, dass NULL für „nicht vorhanden“ steht und ein Leerstring für „nicht angegeben,“ dann hat das genau die definierte Aussagekraft und keine andere. NULL ist auch nur ein Wert, der interpretiert werden muss.

                    Wenn man sinnlos ohne Definition irgendwelche Werte vergibt, hat das allerdings nie eine Aussagekraft, unabhängig von NULL, das ist wahr.

                    wenn ich informationen über den kunden gewinne und diese auch benötige, würde ich sie explizit speichern und nicht in einem NULL wert "verstecken".

                    Ich verstecke gar nichts, welche Aussagekraft welcher Wert hat, wird vorher definiert.

                    再见,
                     克里斯蒂安

                    --
                    http://wwwtech.de/
                    IRC-Clients und Irssi-Scripting | Flyspray
                    Beware Evildoers for my deed is done and every little damsel in distress will be shelted!
                    1. yo,

                      Naja, sei mir nicht bös, aber das ist doch einfach nicht wahr. Welche Aussagekraft NULL hat, ist eine reine Definitionsfrage. Wenn ich für meine Applikation definiere, dass NULL für „nicht vorhanden“ steht und ein Leerstring für „nicht angegeben,“ dann hat das genau die definierte Aussagekraft und keine andere. NULL ist auch nur ein Wert, der interpretiert werden muss.

                      von böse werden sind wir weit entfernt und gibt ja auch kein grund dazu, werden halt unterschiedliche meinungen ausgetauscht. man kann NULL dazu "missbrauchen" und es so definieren, dass es der bedeutung von "nicht vorhanden" gleich kommt. und nicht nur das, ich könnte dann NULL auch noch ganz anders definieren, zum beispiel "will nicht" oder was ähnliches. aber damit lege ich gleichzeitig fest, dass ich die eigentliche bedeutung, nämlich keine aussage darüber treffen kann, nicht mehr für NULL verwenden kann (mal davon abgesehen, dass die funktionalitäten auf NULL werte ganz anders reagieren als auch "normale" werte, nämlich davon ausgehen, dass ich nie eine aussage bei NULL werten treffen kann).

                      aber lass es uns auf eine frage konzentrieren, wenn du NULL als "nicht vorhanden" definierst, wie willst du dann die festhalten, über die du keine aussage treffen kannst, wel du noch keine info hast ?

                      Ilja

                      1. Mahlzeit Ilja,

                        man kann NULL dazu "missbrauchen" und es so definieren, dass es der bedeutung von "nicht vorhanden" gleich kommt.

                        Wieso "missbrauchen"? Wie definierst Du denn bitte NULL sonst, wenn nicht "Wert ist nicht vorhanden"?

                        und nicht nur das, ich könnte dann NULL auch noch ganz anders definieren, zum beispiel "will nicht" oder was ähnliches.

                        Könntest Du, wäre aber unsinnig.

                        aber damit lege ich gleichzeitig fest, dass ich die eigentliche bedeutung, nämlich keine aussage darüber treffen kann, nicht mehr für NULL verwenden kann

                        Was bedeutet denn für Dich "keine Aussage treffen"?

                        aber lass es uns auf eine frage konzentrieren, wenn du NULL als "nicht vorhanden" definierst, wie willst du dann die festhalten, über die du keine aussage treffen kannst, wel du noch keine info hast ?

                        In Deinem konkreten Beispiel:

                        • "Kunde wurde noch nicht befragt" = "es ist keine Telefonnummer bekannt" = "kein Wert vorhanden" = NULL

                        • "Kunde wurde befragt und will kontaktiert werden" = "er hat seine Telefonnummer mitgeteilt" = "String-Wert mit Telefonnummer vorhanden" = "08154711"

                        • "Kunde wurde befragt und will nicht kontaktiert werden" = "er hat seine Telefonnummer nicht mitgeteilt" = "leerer String-Wert" = ""

                        Wo genau ist jetzt das Problem?

                        MfG,
                        EKKi

                        --
                        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                        1. Mahlzeit Ilja,

                          Wieso "missbrauchen"? Wie definierst Du denn bitte NULL sonst, wenn nicht "Wert ist nicht vorhanden"?

                          das sagte ich bereits mehrfach, NULL bedeutet nicht definiert, es ist keine aussage darüber möglich.

                          »» und nicht nur das, ich könnte dann NULL auch noch ganz anders definieren, zum beispiel "will nicht" oder was ähnliches.

                          Könntest Du, wäre aber unsinnig.

                          du bist schnell mit deinen urteilen wie unsinn oder blödsinn. grundsätzlich kann ich dem NULL wert eine bestimmte definition oder auch bedeutung zukommmen lassen. um welche es sich dabei handelt, spielt eigentlich keine rolle.

                          • "Kunde wurde noch nicht befragt" = "es ist keine Telefonnummer bekannt" = "kein Wert vorhanden" = NULL

                          so richtig hast du die beiträge aber nicht verfolgt oder ? es geht ja gerade um die problematik, dass ich probleme bekomme, wenn ich verschiedene bedeutung in den NULL wert hineininterpretiere. die kannst du hinten rum nicht mehr richtig auslesen und interpretieren. und "kunde wurde noch nicht befragt" <> "kunde hat keine e-mail". wie wilst du die beiden den unterscheiden, wenn ich für beide einen NULL wert verwende ?

                          • "Kunde wurde befragt und will nicht kontaktiert werden" = "er hat seine Telefonnummer nicht mitgeteilt" = "leerer String-Wert" = ""

                          darüber unterhalten wir uns wieder, wenn du das mal mit dem leeren string unter otracle ausprobiert hast.

                          Ilja

                          1. Mahlzeit Ilja,

                            so richtig hast du die beiträge aber nicht verfolgt oder ? es geht ja gerade um die problematik, dass ich probleme bekomme, wenn ich verschiedene bedeutung in den NULL wert hineininterpretiere.

                            Wer will denn verschiedene Bedeutungen in den Wert NULL hineininterpretieren? NULL bedeutet schlicht und einfach, dass kein Wert vorhanden ist. Weder ein leerer Wert noch ein nichtleerer Werte - einfach gar keiner.

                            "kunde wurde noch nicht befragt" <> "kunde hat keine e-mail".

                            Natürlich. Deswegen würde ich ja für diese beiden unterschiedlichen Aussagen auch unterschiedlich Werte benutzen ... z.B. für ersteres NULL, für letzteres einen leeren String.

                            wie wilst du die beiden den unterscheiden, wenn ich für beide einen NULL wert verwende ?

                            Will ich ja gar nicht. Also weder unterscheiden, noch den gleichen Wert für unterschiedliche Aussagen verwenden.

                            darüber unterhalten wir uns wieder, wenn du das mal mit dem leeren string unter otracle ausprobiert hast.

                            Habe ich ja jetzt. Und in dem Fall gebe ich Dir auch - wie bereits geschrieben - Recht: Oracle ist dahingehend Bockmist. Ich würde von einem vernünftigen Datenbanksystem erwarten, dass es bei einem VARCHAR2-Feld zwischen NULL, '', ' ' und 'foobar' unterscheidet.

                            MfG,
                            EKKi

                            --
                            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                            1. yo,

                              »» "kunde wurde noch nicht befragt" <> "kunde hat keine e-mail".

                              Natürlich. Deswegen würde ich ja für diese beiden unterschiedlichen Aussagen auch unterschiedlich Werte benutzen ... z.B. für ersteres NULL, für letzteres einen leeren String.

                              gut, aber genau das ist gegenstand dieser diskussion, nämlich ob man die aussage "hat keine e-mail adresse" auch als NULL wert in der datenbank speichern kann. willtst du also meine meinung hier unterstreichen, sieht ja so aus, als wenn wir dies bezüglich einer meinung wären ?

                              Ich würde von einem vernünftigen Datenbanksystem erwarten, dass es bei einem VARCHAR2-Feld zwischen NULL, '', ' ' und 'foobar' unterscheidet.

                              nun, oracle ist das erste kommerzielle rdbms und wohl auch das erfolgreichste (sicherlich ansichtssache). das schützt sie nicht von fehlern, aber ob das einer ist, das ist eine neue diskussion.....

                              Ilja

                              1. Mahlzeit Ilja,

                                gut, aber genau das ist gegenstand dieser diskussion, nämlich ob man die aussage "hat keine e-mail adresse" auch als NULL wert in der datenbank speichern kann.

                                IMHO nein. Und zwar sowohl bgzl. der Aussage, dass dies Gegenstand der Diskussion ist (denn das muss in meinen Augen nicht diskutiert werden), als auch ob ich es so machen würde. Die Aussage "Kunde hat keine Email-Adresse" beinhaltet nämlich die Information, dass ich beim Kunden bereits nachgefragt habe und ist eine gänzlich andere als die Aussage "Es ist nicht bekannt, ob der Kunde eine Email-Adresse hat".

                                "Es ist nicht bekannt" = NULL
                                "Kunde hat keine" oder "Kunde will sie uns nicht mitteilen" = ""
                                "Kunde hat eine" = "john.doe@example.com"

                                willtst du also meine meinung hier unterstreichen, sieht ja so aus, als wenn wir dies bezüglich einer meinung wären ?

                                Das bezweifle ich noch - da Deine Definitionen bzw. Ausdrucksweisen mir manchmal etwas missverständlich vorkommen. Insofern möchte ich Dir erst dann zustimmen, wenn ich auch der Meinung bin, dass wir das Gleiche meinen ...

                                »» Ich würde von einem vernünftigen Datenbanksystem erwarten, dass es bei einem VARCHAR2-Feld zwischen NULL, '', ' ' und 'foobar' unterscheidet.

                                nun, oracle ist das erste kommerzielle rdbms und wohl auch das erfolgreichste (sicherlich ansichtssache).

                                Das hat erst einmal nichts zu heißen. Microsoft ist auch der weltgrößte Betr[ie|ü]bssystemhersteller (und einer der größten Hersteller von Anwendungssoftware) für PCs - und über die Qualität ihrer Produkte sage ich jetzt mal nichts.

                                das schützt sie nicht von fehlern, aber ob das einer ist, das ist eine neue diskussion.....

                                In meinen Augen ist das in keinster Weise eine neue Diskussion. Es ist definitiv ein Unterschied, ob ich in einem Feld "nichts" (= NULL) oder ein leeres bzw. neutrales bzw. wertfreies Datum (numerisch = 0, String = "") speichere. Insbesondere haben derart unterschiedliche Werte höchst unterschiedliche Aussagekraft. Wenn ein DBMS das nicht zu unterscheiden vermag bzw. die Unterschiede dazwischen verwischt, ist es IMHO fehlerhaft und (in diesem Punkt) schlecht ... egal, wie toll oder bekannt der Hersteller ist.

                                MfG,
                                EKKi

                                --
                                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                                1. yo,

                                  "Es ist nicht bekannt" = NULL
                                  "Kunde hat keine" oder "Kunde will sie uns nicht mitteilen" = ""
                                  "Kunde hat eine" = "john.doe@example.com"

                                  mit der wahl von NULL im sinne unbekannt stimme ich dir zu, so würde ich es auch immer verwenden. mit dem "" wert bin ich nicht so überzeugt und finde die vorgehensweise von oracle nicht so dumm wie du. für mich wirkt das abspeichern eines wertes, der sich von NULL unterscheidet, aber auch nicht wirklich einen wert beinhaltet, ein wenig wie taschenspielertricks auf datenbankebene.

                                  die ganze problematik ensteht dadurch, dass man ein attribut hat, wie zum beispiel e-mail. hat der kunde eine e-mail adresse, trage ich sie ein, kann ich keine aussage darüber treffen, dann eben NULL. nun fängt der schlammassel aber damit an, dass ich noch mehr infos bezüglich der e-mail spalte speichern will, wie zum beispiel folgende:

                                  "Kunde will sie uns nicht mitteilen"
                                  "Kunde hat keine"
                                  "Kunde wurde angerufen, aber noch nicht erreicht"

                                  etc.

                                  und dann fange ich an diese informationen irgendwie auch noch in die spalte e-mail unterzubringen, indem ich versuche pseudo-werte wie "" oder ähnliches in die spalten reinzuschreiben und sie dann noch hinten rum richtig interpretieren muss, was die wartbarkeit nicht gerade einfacher macht. in meinen augen ist das schlechter stil. wie willst du den diese ganzen möglichen informationen festhalten, wenn du nicht nur "nicht vorhanden" persistieren willst, sondern auch andere infos wie oben beschrieben, fängst du dann an ein Zahlensystem dort abbzubilden in der spalte e-mail ?

                                  ich hatte eine zeit lang viel mit migration zu tun und ich fand es schrecklich, was da zum teil alles in einer spalte wie e-mail drinne stand, leestrings, 0 er, "-" und was nicht noch alles für ein quatsch. für mich ist das sehr unsauber, in die spalte gehört für mich eine e-mail adresse oder ein NULL wert und sonst nichts. und wenn ich diese vorgehensweise berücksichtige, dann brauche ich solch möchte-gern-werte wie "" gar nicht mehr. will ich zusätzliche informationen speichern, dann eben nicht in der spalte e-mail, sondern an einem anderen ort, wo es hingehört. das ist in meinen augen viel sauberer.

                                  Wenn ein DBMS das nicht zu unterscheiden vermag bzw. die Unterschiede dazwischen verwischt, ist es IMHO fehlerhaft und (in diesem Punkt) schlecht ... egal, wie toll oder bekannt der Hersteller ist.

                                  nein, von fehlerhaft kann keine rede sein. es mag eine andere vorgehensweise sein, aber als fehler würde ich das nicht bezeichnen. man muss es aber wissen.

                                  Ilja

                      2. 你好 Ilja,

                        Naja, sei mir nicht bös, aber das ist doch einfach nicht wahr. Welche Aussagekraft NULL hat, ist eine reine Definitionsfrage. Wenn ich für meine Applikation definiere, dass NULL für „nicht vorhanden“ steht und ein Leerstring für „nicht angegeben,“ dann hat das genau die definierte Aussagekraft und keine andere. NULL ist auch nur ein Wert, der interpretiert werden muss.

                        von böse werden sind wir weit entfernt und gibt ja auch kein grund dazu, werden halt unterschiedliche meinungen ausgetauscht. man kann NULL dazu "missbrauchen" und es so definieren, dass es der bedeutung von "nicht vorhanden" gleich kommt.

                        Von missbrauchen kann gar keine Rede sein, wenn eine Angabe nicht vorhanden ist in dem Sinne, wie ich es definiert hatte (Kunde wurde noch nicht befragt), kann keine Aussage darüber getroffen werden. Womit wir wieder bei der Bedeutung von NULL wären… ;)

                        und nicht nur das, ich könnte dann NULL auch noch ganz anders definieren, zum beispiel "will nicht" oder was ähnliches. aber damit lege ich gleichzeitig fest, dass ich die eigentliche bedeutung, nämlich keine aussage darüber treffen kann, nicht mehr für NULL verwenden kann

                        Klar, man kann viel machen, ist halt immer die Frage: was ist sinnvoll für den aktuellen Fall? Wenn du damit deine Anforderungen erfüllst und es in deine Daten passt…

                        (mal davon abgesehen, dass die funktionalitäten auf NULL werte ganz anders reagieren als auch "normale" werte, nämlich davon ausgehen, dass ich nie eine aussage bei NULL werten treffen kann).

                        Das wäre dir in dem Augenblick ja bewusst und man wüsste damit umzugehen.

                        aber lass es uns auf eine frage konzentrieren, wenn du NULL als "nicht vorhanden" definierst, wie willst du dann die festhalten, über die du keine aussage treffen kannst, wel du noch keine info hast ?

                        Ich glaube, wir haben hier ein Kommunikationsproblem.

                        Gedacht hatte ich so: Keine Information darüber, weil der Kunde nicht befragt wurde: NULL. Information erhalten (Angabe verweigert oder „Hab ich nich!“ so was in der Richtung): Leerstring. Information erhalten und auch ein Datum erhalten: Wert des Datums.

                        再见,
                         克里斯蒂安

                        --
                        http://wwwtech.de/
                        IRC-Clients und Irssi-Scripting | Flyspray
                        Das Sein entsteht aus dem Nicht-Sein.
                        1. yo 你好,

                          Klar, man kann viel machen, ist halt immer die Frage: was ist sinnvoll für den aktuellen Fall? Wenn du damit deine Anforderungen erfüllst und es in deine Daten passt…

                          genau so sehe ich das auch, es ist ein abwägen der vorteile und der nachteile. deswegen sagte ich ja auch, ich <rate ab> in NULL werten irgendeine aussage mit reinzulegen. letztlich muss es jeder selbst entscheiden. ist so wie mit künstlichen schlüssel oder gutes guts daten-design. man muss es nicht machen, man könnte es auch anders lösen, aber ich würde es jedem anraten.

                          der grund liegt auf der hand für mich. wenn ich keine weitere bedeutung in NULL werte reinlege, dann werde ich auch mit großer wahrscheinlichkeit nie probleme dies bezüglich haben, es ist einfach sauberer. ich muss nicht noch im nachinein die eventuelen seiteneffekte beachten. definiere ich aber in NULL werten eine bedeutung rein (welche das auch immer ist), dann kann es zu den von mir geschilderten problemen kommen, nämlich dass ich in NULL werten verschiedene ergebnisse habe und sie nicht mehr auseinander bekomme.

                          oder mit anderen worten, bei den einem weg läuft das risiko gegen 0, bei dem anderen bleibt immer ein risiko bestehen. nun ja, muss jeder selbst wissen, wofür er sich entscheidet.

                          Das wäre dir in dem Augenblick ja bewusst und man wüsste damit umzugehen.

                          wo wir wieder bei den risiken sind. ich kann ein und dieselbe information auch an verschiedenen stelle in der datenbank speichern und es kann gut gehen, muss dann halt immer nur an mehreren stellen die schraube drehen. aber muss ich mir das leben wirklich schwerer machen, als es nötig ist ?

                          Gedacht hatte ich so: Keine Information darüber, weil der Kunde nicht befragt wurde: NULL.

                          den stimme ich zu, so würde ich NULL anwenden.

                          Information erhalten (Angabe verweigert oder „Hab ich nich!“ so was in der Richtung): Leerstring. Information erhalten und auch ein Datum erhalten: Wert des Datums.

                          so und das ist doch genau das, was ich erwarte (mal von dem leerstring abgesehen). damit reagierst du doch ganz anders als NUR einen NULL wert zu speichern. wie du diese information abspeicherst ist wurscht, hauptsache nicht nur mit einem NULL wert.

                          Ilja

                          1. 你好 Ilja,

                            yo 你好,

                            Hihi.

                            Gedacht hatte ich so: Keine Information darüber, weil der Kunde nicht befragt wurde: NULL.

                            den stimme ich zu, so würde ich NULL anwenden.

                            Information erhalten (Angabe verweigert oder „Hab ich nich!“ so was in der Richtung): Leerstring. Information erhalten und auch ein Datum erhalten: Wert des Datums.

                            so und das ist doch genau das, was ich erwarte (mal von dem leerstring abgesehen). damit reagierst du doch ganz anders als NUR einen NULL wert zu speichern. wie du diese information abspeicherst ist wurscht, hauptsache nicht nur mit einem NULL wert.

                            Nur: genau so hatte ich es von Anfang an beschrieben *g* Dass es unzureichend ist, in beiden Fällen NULL zu wählen, dürfte klar sein, liegt aber nicht an NULL, sondern einer doppeldeutigen Definition.

                            再见,
                             克里斯蒂安

                            --
                            http://wwwtech.de/
                            IRC-Clients und Irssi-Scripting | Flyspray
                            <g[oma]> peter lustig ist auf jeden fall besser als peter huth, obwohl der auch lustig ist.
                            1. yo,

                              Nur: genau so hatte ich es von Anfang an beschrieben *g* Dass es unzureichend ist, in beiden Fällen NULL zu wählen, dürfte klar sein, liegt aber nicht an NULL, sondern einer doppeldeutigen Definition.

                              da drehen wir uns dann im kreis. sicherlich sind wir uns einig, dass ich einem wert (in diesem fall NULL) nicht zwei bedeutungen zuteilen kann. aber genau darum geht ja die diskusion, ich habe nur einen platz zur verfügung. und den wert NULL brauche ich eben schon für "nicht definiert". wenn ich es nicht so mache, schließe ich den zustand "nicht definiert" implizit aus und dann kann ich auch gleich NOT NULL verwenden. und wie gesagt, die funktionalitäten der dbms zielen darauf ab, dass NULL als "nicht definiert" interpretiert wird.

                              Ilja

              2. wenn man NULL als "nicht vorhanden" nimmt, hast du keine möglichkeit mehr, zwischen der eigentlichen funktion, nämlich keine aussage darüber treffen zu können, zu unterscheiden. gerne gebe ich dir dazu ein beispiel.

                "Nicht vorhanden" ist wohl eher als "Kein Daten-Eintrag" zu verstehen.

                eine dba/entwickler geht die kundentabelle durch und stellt fest, dass bei einigen die e-mail adresse fehlt. da aber die firma für die zukunft plant, zusätzliche infos und angebote auch per e-mail zu verschicken, druckt er eine liste der kunden aus, die dann von einem mitarbeiter angerufen werden sollen. erklärt sich der kunde bereit, diese zusätzlichen service wahrzunehmen, trägt der mitarbeiter die neue e-mail adresse ein. ist der kunde dazu nicht bereit oder kann der kunde nicht erreicht werden, trägt er nichts ein.

                der dba/entwickler prüft am ende der woche, bei wievielen der kunden immer noch die e-mail adresse fehlt. inzwischen sind es auch deutlich weniger (der mitarbeiter war fleissig). also druckt er die jetzt kleinere liste für die nächste woche aus und gibt sie wieder dem mitarbeiter. kurze zeit später klopft der mitarbeiter an die tür und beklagt sich, dass er nun kunden doppelt anruft und die kunden sich dadurch genervt fühlen...

                den rest kannst du dir selbst denken, du wirst keine chance haben, die NULL werte aufzuteilen in "schon angerufen will aber nicht oder hat keine e-mail" und zwischen denen, "die noch nicht erreicht werden konnten".

                Was haben die Informationen "E-Mail-Adresse" und "Gab E-Mail-Adresse/Fehlt noch/Gibt keine" auch in einer Spalte zu suchen? Sie unterscheiden sich doch. Dein Problem hat nichts damit zu tun, welche Bedeutung NULL hat.

                --
                Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                1. yo,

                  wenn du deine aussage nimmst, in der ich dir zustimme (ist ein wenig von dem jeweiligen fall abhängig)....

                  Was haben die Informationen "E-Mail-Adresse" und "Gab E-Mail-Adresse/Fehlt noch/Gibt keine" auch in einer Spalte zu suchen? Sie unterscheiden sich doch.

                  dann solltest du nicht zu diesme schluss kommen....

                  Dein Problem hat nichts damit zu tun, welche Bedeutung NULL hat.

                  weil ich mich gerade dagegen auspreche, dass informationen wie "Gibt keine e-mail adresse" in NULL werten unterzubringen.

                  Ilja

                  1. Dein Problem hat nichts damit zu tun, welche Bedeutung NULL hat.

                    weil ich mich gerade dagegen auspreche, dass informationen wie "Gibt keine e-mail adresse" in NULL werten unterzubringen.

                    Nach Lesen deines anderen Beitrags ist mir erst klar, welchem Missverständnis entweder du unterliegst oder ich unterliege. Mit "Nicht vorhanden" meine ich definitiv "Kein Eintrag in der Datentabelle" für die Bedeutung der NULL, im von dir genannten Beispiel also "In der Tabelle befindet sich kein Eintrag für die E-Mail-Adresse für diesen Kunden". Ich meine *nicht*, dass damit festgelegt sein soll, dass für die E-Mail-Adresse gilt "Kunde hat keine", aber nicht "bisher nicht bekannt", sondern beides der Fall sein kann, was separat gespeichert werden müsste.

                    Ich denke auch, dass Cheatah es genauso meinte, denn sein Kontext war Datenbanken und "nicht vorhanden" sollte also für "Kein Eintrag in Tabelle" stehen, die Interpretation der Daten als E-Mail-Adresse, Alter, etc. ist ja unabhängig davon.

                    --
                    Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                    Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  2. gegenfrage:
    was machst du wenn du mal den wert 0 in die datenbank speichern willst?
    bzw. wie stellst du dann fest ob in dem feld eine 0 steht oder ob es leer ist?

    damit dürfte sich die frage erledigt haben.

    --
    for your security, this text has been encrypted by ROT13 twice.