MySql Feldgrößen vorgeben

Ronald Nickel

Legendäres Mitglied
Ein glückseliges Hallo an allle Datenbankprofies und weitere Ayomisten.

Das Attribut VarChar(50) heißt ja nicht, das ich maximal 50 Zeichenh in dieses MySql-Datenbankfeld eingeben kann gelle?. Wie aber gebe ich unter Berücksichtigung der Performance und DB-Größe die optimale Feldgrgröße bei Strings und Values vor. Was nehme ich für eine Feldgröße bei einer maximal 5 stellige INT (Posteleitzahl). Irgendwie habe keine Peilung, was mir die MySql-Doku sagen will.

Hat mir da jemand ne Starthilfe?
Gruß Ronny
 
Hallo ronnic,

doch doch, varchar(50) heißt, dass das Feld maximal 50 Zeichen verträgt. Alles was darüber hinausgeht wird abgeschnitten. Der Unterschied zwischen char und varchar ist folgender: bei char werden die nicht genutzten Zeichen mit üblicherweise Spaces aufgefüllt.

Was für Deine DB optimal ist hängt letzten Endes, sorry für die Plattheit, von Deinen Anforderungen ab: wie viele Einträge sollen verwaltet werden / wie wichtig ist der Datenaustausch mit anderen Applikationen / wie einfach soll die Nutzung der Tabellen sein etc... Normalerweise würde ich heute bei kleineren Projekten nicht mehr auf DB-Größe optimieren.

Gruß

Martin
 
QUOTE (ronnic @ Di 6.3.2007, 12:59)Was nehme ich für eine Feldgröße bei einer maximal 5 stellige INT (Posteleitzahl).

Einfach ein brauchbares Datenbanksystem verwenden
biggrin.gif


Das ist ein varchar(5), damit man von links her suchen kann und führende Nullen nicht abgeschnitten werden. Zusätzlich mit RegEx einschränken, daß nur Ziffern (\d{5}) zulässig sind.

Wenn das DbSystem RegEx nicht kann, wird empfohlen, Punkt 1 zu beachten.
 
Gehe ich dann recht in der Annahme das der Maximalwert bei
einem TINYINT "9999" ist?
bei einem INT "99999999999" ist?

Was sit wen ich einen Range von -1000 bis +1000 brauche? Das passt ja dann nicht mehr in ein TinyINT Feld

Gruß Ronny
 
So, ich habe ein wenig gebuddelt und muss sagen ich verwirrten denn je. Folgendes konnte ich ermitteln:

TINYINT-Werte ohne Vorz. ist 0 bis 28 – 1 oder 0 bis 255.
SMALLINT-Werte ohne Vorz. ist 0 bis 216 – 1 oder 0 bis 65535.
BIGINT-Werte mit Vorz. ist –263 – bis 263 – 1 oder –9223372036854775808 bis 9223372036854775807.
BIGINT-Werte ohne Vorz. ist 0 bis 264 – 1 oder 0 bis 18446744073709551615.
INT mit Vorz.ist –231 bis 231 – 1 oder -2147483648 bis 2147483647.
INT ohne Vorz. ist 0 bis 232 – 1 oder 0 bis 4294967295.

Keines der Werte, die als Maximalwerte angegeben werden hat doch was mit der Maximalen Zeichenanzahl zu tun oder?

Ein TinyINT geht doch von 0 -255 und nicht von 0-9999. Kann mir das jemand plausibel erklären?

Gruß Ronny
 
Tipp mal in den Taschenrechner 2x2x2x2.... ein, dann wird dir schnell klar werden warum das so ist.
Es handelt sich um Zweierpotenzen-1

Man darf halt nicht vergessen das Zahlen, Buchstaben irgendwann für den Rechner doch nur Nullen und Einser sind.

There are only 10 types of people in the world: Those who understand binary, and those who don't
wink.gif
wink.gif
 
QUOTE (Ronald Nickel @ Di 6.3.2007, 15:49)Ein TinyINT geht doch von 0 -255 und nicht von 0-9999. Kann mir das jemand plausibel erklären?

Zahlen werden nicht mit den Ziffern 0-9, sondern direkt binär codiert gespeichert. Ein Byte hat 8 Bit, jedes Bit kann aus- oder angeschaltet sein, das macht 2^8 = 256 Möglichkeiten, die auf die Zahlen 0-255 abgebildet werden. Das geht also mit einer TinyInt-Zahl - ohne Vorzeichen.

Größere sind dann SmallInt = 2 Byte = 2^16 Möglichkeiten für 0-65535. Das Vorzeichen braucht zur Codierung ein Bit, deshalb sind da die Maxima kleiner.


QUOTE (Ronald Nickel @ Di 6.3.2007, 15:49)Keines der Werte, die als Maximalwerte angegeben werden hat doch was mit der Maximalen Zeichenanzahl zu tun oder?


Die maximale Zeichenanzahl taucht ja erst bei der Umrechnung der Binärzahlen in Dezimalzahlen auf - deshalb muß man die passende Größe für Zahlen und für Texte nehmen.

Für Postleitzahlen braucht man aber (1) führende Nullen (die bei Zahlen entfernt werden) und man will von links suchen können (Wert Like '1' + '%'). Also nimmt man für Postleitzahlen in Wirklichkeit Postleit-Strings, eben varchar(5).
 
Wie Hatschi schon schreibt: es ist verwirrend, wenn man es nicht kennt.

Die Typen CHAR und VARCHAR beziehen sich auf eine Anzahl von Zeichen. Die Zeichenkette "12345" hat also 5 Zeichen, und könnte in einem CHAR(5) gespeichert werden. In einem CHAR(5) könnte dann aber auch "VWXYZ" stehen.

Die Integer-Typen sind da anders. Der TINYINT in Deinem Beispiel besteht aus 8 bit (also einem Byte). Damit kannst Du Werte von 0 (binär 00000000) bis 2 hoch 8 minus 1 (255, binär 11111111) speichern. Wenn man das mit Vorzeichen macht, wird eins der Bits für als Marker für plus/minus benutzt. Man kann dann Werte von -128 (binär 1 0000000) bis 2 hoch 7 minus 1 (127, binär 0 1111111) speichern.

Ich schreibe mal eine kleine Tabelle für ein 3 bit - Integer ohne Vorzeichen:

000: 0
001: 1
010: 2
011: 3
100: 4
101: 5
110: 6
111: 7

Und mit Vorzeichen (1 bedeutet: minus):

1 00: - 4
1 01: - 3
1 10: - 2
1 11: - 1
0 00: 0
0 01: - 1
0 10: - 2
0 11: - 3

Wenn Du viel Energie und Neugier hast kannst Du ja mal das Thema "Binärzahl" im Wikipedia nachschlagen: http://de.wikipedia.org/wiki/Bin%C3%A4rzahl

Gruß

Martin
 
Ok dann werde ich beizeiten Etwas Bewusstseinserweiterndes einwerfen und mich mal über diese Materie hermachen. Das aber Char und Varchar in der Feldgröße anders bejandelt werden wie integer hilft mir schon mal sehr weiter.

Danke an Alle.

Gruß Ronny
 
Zurück
Oben