Blob: Was bedeutet die geklammerte Zahl beim Feldtyp?

Hallo,

ich sehe derweilen öfters solche Typangaben in MySQL:

int(10)
varchar(200)
varchar(255)
mediumint(8)

Was die Typen bzw. "unsigned" bedeutet weiß ich natürlich.
Und was enum('ja','nein') u.ä. bedeutet ist mir auch klar.

Aber was heißt denn bspw. int(10) und varchar(200)?

MfG
Blob

  1. hey,

    Aber was heißt denn bspw. int(10) und varchar(200)?

    das ist die Anzahl der zulässigen Stellen des Datensatzes.

    Bei int(10) kannst du also maximal eine Zahl von 9.999.999.999 eingeben, bei varchar(200) demzufolge maximal 200 Zeichen.

    cu

    1. Hi!

      Aber was heißt denn bspw. int(10) und varchar(200)?
      das ist die Anzahl der zulässigen Stellen des Datensatzes.

      Das ist richtig bei String-Typen (aber: Feld, nicht Datensatz).

      Bei int(10) kannst du also maximal eine Zahl von 9.999.999.999 eingeben [...]

      Nein, INT geht nur bis 2.irgendwas oder als unsigned bin 4.irgendwas. Obendrein hat bei nummerischen Typen die Längenangabe nur Einfluss auf die Anzeige auf der MySQL-Konsole. Der Wertebereich wird damit nicht eingeschränkt.

      Lo!

      1. Der max. positive Wert bei einem 4 Byte int ist 2^31 = 2147483648, das hat gerade 10 Stellen.
        Ich kapier aber auch nicht warum man hier die Stellen der Dezimalzahl angibt. Ist doch Unsinn, denn es kommt ja auf die Anzahl Bytes an, die dem int zugehordnet sind.

        Obendrein hat bei nummerischen Typen die Längenangabe nur Einfluss auf die Anzeige auf der MySQL-Konsole.

        Wie wirkt sich das da aus?

        1. Hi Encoder,

          Obendrein hat bei nummerischen Typen die Längenangabe nur Einfluss auf die Anzeige auf der MySQL-Konsole.
          Wie wirkt sich das da aus?

          Das wirkt sich nicht nur auf der Konsole aus:

          „Wenn hierzu das optionale Erweiterungsattribut ZEROFILL verwendet wird,
            erfolgt ein Auffüllen nicht mehr mit Leerzeichen, sondern mit Nullen.
            Bei einer Spalte etwa, die als INT(5) ZEROFILL deklariert ist, wird der
            Wert 4 als 00004  abgerufen.” (Quelle)

          Auf der verlinkten Seite sind übrigens auch die Wertebereiche für TINYINT, SMALLINT, INT und BIGINT genannt.

          Viele Grüße,
            ~ Dennis.

          1. Auf die Gefahr hin dass ich jetzt meine Ahnungslosigkeit bzgl. der Datenspeicherung von MySQL offenlege ...

            „Wenn hierzu das optionale Erweiterungsattribut ZEROFILL verwendet wird,
              erfolgt ein Auffüllen nicht mehr mit Leerzeichen, sondern mit Nullen.
              Bei einer Spalte etwa, die als INT(5) ZEROFILL deklariert ist, wird der
              Wert 4 als 00004  abgerufen.”

            Ich sehe auf der Seite dass ein int als 4 Bytes gespeichert wird und nicht als ein 10 oder sonst wie viele Stellen langer String. Bin auch ziemlich glücklich darüber :-)
            Aber was heißt "abgerufen"? Bezieht sich das auf die Rückgabe von Daten von der DB zum Programm?

            Was mich dann vollends aus dem Tritt bringt wäre das hier:
            *******
            Beachten Sie, dass, wenn Sie Werte in einer Integer-Spalte speichern, die größer sind als die Anzeigebreite, unter Umständen Probleme auftauchen, wenn MySQL Temporärtabellen für einige komplizierte Joins anlegt, denn in diesen Fällen setzt MySQL voraus, dass die Daten in die ursprüngliche Spaltenbreite passen.
            *******
            Wenn ich eine Integer Spalte habe und damit etwas anstelle, das temporäre Tabellen benötigt, dann kann es in diesen Tabellen Integer Spalten (also gleicher Datentyp = 4 Bytes) geben, die andere Spaltenbreiten haben?

            1. Hi!

              Auf die Gefahr hin dass ich jetzt meine Ahnungslosigkeit bzgl. der Datenspeicherung von MySQL offenlege ...

              Das ließe sich mit einem circa 5 Zeilen langen Script ändern.

              „Wenn hierzu das optionale Erweiterungsattribut ZEROFILL verwendet wird, erfolgt ein Auffüllen nicht mehr mit Leerzeichen, sondern mit Nullen. Bei einer Spalte etwa, die als INT(5) ZEROFILL deklariert ist, wird der Wert 4 als 00004  abgerufen.”
              Aber was heißt "abgerufen"? Bezieht sich das auf die Rückgabe von Daten von der DB zum Programm?

              Ja. Entgegen meiner ersten Annahme/Aussage bezieht sich das auch auf die Rückgabe der Ergebnismenge über die MySQL-API. Integer-Spalten landen als String im PHP-Script. Die Längenangabe hat aber nur bei ZEROFILL eine Auswirkung. Ohne diese, wird ein String der Länge entsprechend der Ziffernanzahl in Dezimaldarstellung geliefert.

              Wenn ich eine Integer Spalte habe und damit etwas anstelle, das temporäre Tabellen benötigt, dann kann es in diesen Tabellen Integer Spalten (also gleicher Datentyp = 4 Bytes) geben, die andere Spaltenbreiten haben?

              Da kein Beispiel angegeben ist, kann ich mir nur vorstellen, dass die Probleme bei einem impliziten Typecast nach String auftreten können, denn da spielt die Länge eine Rolle.

              Lo!

              1. Das ließe sich mit einem circa 5 Zeilen langen Script ändern.

                Auch hier glänze ich mit durchgehender Wissensfreiheit. Was meinst du damit?

                Integer-Spalten landen als String im PHP-Script.

                Das schockiert mich ja schon ein bisschen. Ich habe mich darum noch nie groß gekümmert, in der Annahme dass ich hier einen int bekomme. Muss man da noch irgendwelche Prüfungen mit einbauen, oder kann ich einen solche Rückgabewert problemlos als Int ansehen?

                1. Hi!

                  Das ließe sich mit einem circa 5 Zeilen langen Script ändern.
                  Auch hier glänze ich mit durchgehender Wissensfreiheit. Was meinst du damit?

                  Einfach mal ein bisschen experimentieren, Test-Datenbank und -Tabelle anlegen, Quick'n'Dirty-MySQL-Abfrage als PHP-Script erstellen.

                  Integer-Spalten landen als String im PHP-Script.
                  Das schockiert mich ja schon ein bisschen. Ich habe mich darum noch nie groß gekümmert, in der Annahme dass ich hier einen int bekomme. Muss man da noch irgendwelche Prüfungen mit einbauen, oder kann ich einen solche Rückgabewert problemlos als Int ansehen?

                  Wenn du nicht gerade mit ZEROFILL arbeitest und PHP dann aufgrund der führenden Nullen die Zahl als Oktalzahl zu interpretieren versucht, bist du ja durch PHPs automatische Typkonvertierung nicht gezwungen, Zahlen als int oder float zu speichern.

                  Lo!

                  1. Hallo

                    Einfach mal ein bisschen experimentieren, Test-Datenbank und -Tabelle anlegen, Quick'n'Dirty-MySQL-Abfrage als PHP-Script erstellen.

                    Ok und wie müsste ich mir dann den Inhalt der Variablen anschauen? Ich hab schon sowas gemacht, aber da kam ein int nicht mit Nullen gefüllt an, selbst wenn ich den direkt rausgeschrieben habe, also ohne irgendwas damit zu machen das den tatsächlich in einen int konvertiert.
                    Wenn du mir hier ein bisschen den Weg zeigst wär ich dir dankbar, ich hab da nämlich keine Idee wo ich anfangen könnte.

                    Wenn du nicht gerade mit ZEROFILL arbeitest und PHP dann aufgrund der führenden Nullen die Zahl als Oktalzahl zu interpretieren versucht, bist du ja durch PHPs automatische Typkonvertierung nicht gezwungen, Zahlen als int oder float zu speichern.

                    Aber meine Programmierer-Ehre zwingt mich unbedingt dazu :-)
                    Nee ernsthaft, int-Felder lege ich auch als solche in der Datenbank an. Alles andre wär ja grauenhafter Murks.

                    1. Hi!

                      Einfach mal ein bisschen experimentieren, Test-Datenbank und -Tabelle anlegen, Quick'n'Dirty-MySQL-Abfrage als PHP-Script erstellen.
                      Ok und wie müsste ich mir dann den Inhalt der Variablen anschauen?

                      Gib das was die Fetch-Funtion zurückliefert an ein var_dump(). Die übliche Kontrollausgabe eben.

                      Wenn du nicht gerade mit ZEROFILL arbeitest und PHP dann aufgrund der führenden Nullen die Zahl als Oktalzahl zu interpretieren versucht, bist du ja durch PHPs automatische Typkonvertierung nicht gezwungen, Zahlen als int oder float zu speichern.
                      Aber meine Programmierer-Ehre zwingt mich unbedingt dazu :-)

                      Das bezog sich auf PHP, nicht auf MySQL. Das Speichern einer Variable als ein bestimmter Typ erfolgt vor allem aus dem bisherigen Kontext heraus. 42 wird int, 42.23 wird float, "42" wird string, "42" + 23 wird int, "42" . 23 wird string, 42 . 23 wird ebenfalls string (und nicht float), und so weiter. Das sollte heißen, wenn eine Zahl als String aus dem DBMS kommt, kannst du den behandeln, als sei es ein echter Integerwert.

                      Lo!

        2. Hi!

          Der max. positive Wert bei einem 4 Byte int ist 2^31 = 2147483648, das hat gerade 10 Stellen.

          Und der maximale negative ist so ähnlich, hat aber durch das Vorzeichen eine Stelle mehr.

          Ich kapier aber auch nicht warum man hier die Stellen der Dezimalzahl angibt. Ist doch Unsinn, denn es kommt ja auf die Anzahl Bytes an, die dem int zugehordnet sind.

          Die Anzahl Bytes ist im Gegensatz zu Stringtypen fest vorgegeben. Die Stellenanzahl für Integer-Werte anzugeben ist optional und praktisch meist belanglos. Zerofill wird vermutlich kaum einer verwenden, und wenn dann wohl auch eher auf der Konsole. In anderen Programmen als Integer weiterverarbeitet gehen die führenden Nullen sowieso wieder verloren.

          Bei Zahlen ist eine explizite Längenangabe meines Erachtens nur bei den Typen DECIMAL und FLOAT/REAL sinnvoll und teilweise Pflicht.

          Obendrein hat bei nummerischen Typen die Längenangabe nur Einfluss auf die Anzeige auf der MySQL-Konsole.
          Wie wirkt sich das da aus?

          Das Abfrageergebnis wird auf der Konsole in Form einer mit Zeichen "gemalten" Tabelle dargestellt. Die Längenangabe gibt die minimale Breite an, die für diese Zahlenspalte verwendet wird. Wenn die Zahl mit mehr Stellen dargestellt werden muss, wird sie breiter dargestellt.

          Lo!

  2. Aber was heißt denn bspw. int(10) und varchar(200)?

    Max. Anzahl der Stellen bzw. max. Größe des Strings.

    Gruß vom foomaker

    --
    Ändere, was Du ändern kannst.
    Akzeptiere, was Du nicht ändern kannst.
    Lerne, das eine vom anderen zu unterscheiden.