zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden MySQL: Zahlen als INT oder (VAR)CHAR?

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 14.12.2010, 15:55
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard MySQL: Zahlen als INT oder (VAR)CHAR?

Hallo zusammen,

hat jemand Erfahrung mit der Speicherung von Zahlen in einer MySQL-Datenbank?

Konkret geht es darum, einen Zeitstempel (Timestamp) oder aber einen Bool'schen Wert (0 oder 1) zu speichern.

Für den Zeitstempel habe ich bislang immer VARCHAR mit maximaler Länge 11 verwendet, um dem Jahr-2038-Problem zumindest theoretisch aus dem Weg zu gehen. Ansonsten bräuchte man da mindestens INT (unsigned), inklusive den Folgen in 28 Jahren.

Für letzteres (0 oder 1) wäre selbst TINYINT mit dem Wertebereich von -128 bis 127 bzw. 0 bis 255 viel zu groß ausgelegt. Nimmt man dagegen CHAR(1), so ist dieser Wertebereich auch für Buchstaben ausgelegt, was ja nicht Sinn der Sache ist.

Was ist hier besser geeignet? Zahlen als Text speichern oder trotzdem auf die eingebauten Zahlentypen zurückgreifen? Komme mir dabei ja schon ein bisschen vor, als würde ich MySQL vergewaltigen

lg
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 14.12.2010, 16:09
Benutzerbild von protonenbeschleuniger
Verbesserer
XHTMLforum-Kenner
 
Registriert seit: 06.09.2007
Beiträge: 4.963
protonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblick
Standard

Für Timestamps gibt es einen Datentyp MySQL :: MySQL 5.1 Referenzhandbuch :: 11.3.1 Die DATETIME-, DATE- und TIMESTAMP-Typen
Für einen boolschen Wert bietet sich enum an
MySQL :: MySQL 5.1 Referenzhandbuch :: 11.4.4 Der Spaltentyp ENUM
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 14.12.2010, 16:11
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.034
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Ja ich ich teile deine Bedenken mit der Vergewaltigung.

Was spricht gegen INT für den Unix-Timestamp?

Für boolsche Werte würde ich wenn möglich BOOLEAN verwenden, oder wenn nicht möglich (zum Beispiel bei MySQL) ENUM, dort kannst du die erlaubten Werte fest angeben.

@protonenbeschleuniger
Ich denke er meint mit Timestamp einen Unix-Timestamp, dafür gibt es afaik keinen "passenden" Datentyp.

Geändert von inta (14.12.2010 um 16:13 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 14.12.2010, 16:16
Benutzerbild von protonenbeschleuniger
Verbesserer
XHTMLforum-Kenner
 
Registriert seit: 06.09.2007
Beiträge: 4.963
protonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblick
Standard

Ja stimmt, der Timestamp ist Quark. Vielleicht noch ein unsigned vor dem int?

EDIT: Oder man wandelt den Timestamp in ein Zeitformat um
Mit Zitat antworten
  #5 (permalink)  
Alt 14.12.2010, 19:56
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Danke für eure Antworten.

Mir ging es auch sehr stark um den Speicherverbrauch.
Fall 1:
- Boolean in MySQL entspricht TINYINT, 1 Byte, geht bis 255.
- ENUM mit bis zu 255 verschiedenen Werten (so ein Zufall!), 1 Byte.

Also hier kein Unterschied, außer dass sicher nur verwendete Werte wie 0 oder 1 vorkommen. Also liegt hier der Vorteil bei ENUM.

Für den Timestamp möchte ich bewusst keine vorhandenen MySQL-Datentypen wie DATETIME verwenden, da man mit PHP mit diesen wesentlich schlechter umgehen kann als mit Timestamps (beispielsweise seien da mal date() oder strftime() genannt).
unsigned INT geht eben bis zu jenem Jahr 2038. BIGINT würde das Problem lösen, braucht aber nun mal doppelt so viel Speicher (8 Bytes).
Ich denke, in diesem Bereich werde ich in Zukunft normal auf INT setzen. VARCHAR belegt für 10 Stellen 11 Bytes und ist damit eigentlich aus dem Rennen.
Oder?

Kann vielleicht jemand eine Aussage zur Performance machen? Die Timestamp-Felder werden häufig zum Sortieren und Filtern verwendet.
Mit Zitat antworten
  #6 (permalink)  
Alt 14.12.2010, 20:36
Benutzerbild von protonenbeschleuniger
Verbesserer
XHTMLforum-Kenner
 
Registriert seit: 06.09.2007
Beiträge: 4.963
protonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von fox Beitrag anzeigen
Für den Timestamp möchte ich bewusst keine vorhandenen MySQL-Datentypen wie DATETIME verwenden, da man mit PHP mit diesen wesentlich schlechter umgehen kann als mit Timestamps (beispielsweise seien da mal date() oder strftime() genannt).
Genau die gleichen Funktionen (oder ähnliche, die u.U. anders heißen) kannst du auch in mysql verwenden um das Datum in das Format umzuwandeln das du haben möchtest. Vom Speicherverbrauch tut sich da wohl nicht viel, aber prinzipiell sind Zahlen da im Vorteil, da char fast immer in varchar umgewandelt wird. Wenn du aber mal nach dem Feld sortieren willst (oder z.b. Abfragen nach Monat oder Jahr gruppieren) ist das Datum sicher im Vorteil
Mit Zitat antworten
  #7 (permalink)  
Alt 14.12.2010, 23:33
Benutzerbild von Scheppertreiber
Chaot und Nonkonformist.
XHTMLforum-Kenner
 
Registriert seit: 13.03.2007
Ort: Steinmark im Spessart
Beiträge: 7.457
Scheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein Lichtblick
Standard

Da zeigen sich mE mal wieder die Unzulänglichkeiten der verwendeten "Porgrammiersprachen".
Wozu soll mir eine Datenbank einen Datentyp vorgeben bzw wozu benötigt die diesen ?

Doch eigentlich nur zum Indizieren (den Index brauche ich für eine schnelle Suche).
Dann sollte ein Datentyp auch nur dort zum Tragen kommen (und auch nur, um 2 Werte
zu vergleichen).

Stattdessen geht sofort wieder die Gurkerei mit den allseits so beliebten Interpretern
wie PHP los. Es ist doch meine Sache als Programmierer was ich mit zB 4 Bytes anfange.
Das kann für mich ein String oder eine int sein oder irgendetwas anderes.
Meine Sache und kann je nach Abfrage radikal wechseln.

Schaut euch mal Datenbanken wie Btrieve an - hochinteressant und völlig frei
in der Anwendung. Dem Mainstream folgend gibt es natürlich auch einen SQL-Aufsatz.

Und auch im Web gibt es mehr wie immer nur das klägliche PHP.
__________________
Grüße aus dem Spessart, Joe

{ table-layout: biertischistbesser; }
Der Mausinator
Mit Zitat antworten
  #8 (permalink)  
Alt 15.12.2010, 00:44
Benutzerbild von protonenbeschleuniger
Verbesserer
XHTMLforum-Kenner
 
Registriert seit: 06.09.2007
Beiträge: 4.963
protonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblickprotonenbeschleuniger ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Scheppertreiber Beitrag anzeigen
Da zeigen sich mE mal wieder die Unzulänglichkeiten der verwendeten "Porgrammiersprachen".
Wozu soll mir eine Datenbank einen Datentyp vorgeben bzw wozu benötigt die diesen ?
Bei Datenbanken kann ich es nachvollziehen. Aber warum sollte mir eine Programmiersprache vorschrieben, was für ein Datentyp eine Variabel haben soll? Das ist unzulänglich.
Mit Zitat antworten
  #9 (permalink)  
Alt 15.12.2010, 08:17
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

@Scheppertreiber:
Dass du PHP nicht magst ist ja schon oft genug rübergekommen. Aber wie so viele andere Programmier- bzw. Skriptsprachen hat auch diese ihre Vor- und Nachteile.
Genauso wie eine dynamische Typisierung einen angenehmeren bzw. freieren Programmierstil erlaubt, gleichzeitig aber mögliche Fehlerquellen mit sich bringt. Die feste Vorgabe eines Types kann nützlich sein, um ungültige Wertebereiche (siehe Bool'sche Variable) auszuschließen, kann aber auch mit gängigen Funktionen z.B. in PHP geprüft werden.

Zumal hat das Problem hier ganz klar nichts mit dem PHP-Interpreter zu tun.
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 15.12.2010, 09:39
Benutzerbild von Scheppertreiber
Chaot und Nonkonformist.
XHTMLforum-Kenner
 
Registriert seit: 13.03.2007
Ort: Steinmark im Spessart
Beiträge: 7.457
Scheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein LichtblickScheppertreiber ist ein Lichtblick
Standard



Ich möchte generell die Daten so aus einer Datenbank herausbekommen wie ich
sie dem DBMS übergeben habe. Ich bin letzte Woche über so einen Macke in SQLite
gestolpert:

Ich hatte eine Spalte als "text" deklariert und dort nur Mandantennummern mit
Vornullen eingefügt. Irgendwann hat SQLite beschlossen, weil nur Zahlen in der
Spalte stehen müsse es sich um int handeln und die Vornullen rausgeworfen.

Gaaanz toll ...
__________________
Grüße aus dem Spessart, Joe

{ table-layout: biertischistbesser; }
Der Mausinator
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Chat-Thread paracelsus Offtopic 22829 10.09.2017 23:04
Alternativen zur Nutzung von (My)SQL? domsson Serveradministration und serverseitige Scripte 4 06.04.2008 22:06
Ernsthafte Fragen zu MySQL und seiner Indizierung KartoffelKiffer Serveradministration und serverseitige Scripte 2 26.01.2008 00:36
[MySQL] Spalte von INT nach FLOAT konvertieren Tigereye Serveradministration und serverseitige Scripte 3 19.04.2007 18:50
IE reagiert nicht auf negative Zahlen bei margin-left asd CSS 1 05.07.2006 13:12


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:50 Uhr.