Allgemeine MySQL-Felder und ihre entsprechenden Datentypen

111

Ich richte eine sehr kleine MySQL-Datenbank ein, in der Vorname, Nachname, E-Mail-Adresse und Telefonnummer gespeichert sind, und habe Probleme, für jedes Feld den „perfekten“ Datentyp zu finden. Ich weiß, dass es keine perfekte Antwort gibt, aber es muss eine gemeinsame Konvention für häufig verwendete Felder wie diese geben. Zum Beispiel habe ich festgestellt, dass eine unformatierte US-Telefonnummer zu groß ist, um als vorzeichenloses Int gespeichert zu werden. Es muss mindestens ein Bigint sein.

Da ich sicher bin, dass andere Leute dies wahrscheinlich nützlich finden würden, möchte ich meine Frage nicht nur auf die oben genannten Felder beschränken.

Welche Datentypen sind für allgemeine Datenbankfelder geeignet? Felder wie Telefonnummer, E-Mail und Adresse?

Enrico
quelle

Antworten:

71

Jemand wird eine viel bessere Antwort als diese veröffentlichen, wollte aber nur darauf hinweisen, dass ich persönlich niemals eine Telefonnummer in einem ganzzahligen Feld speichern würde, hauptsächlich weil:

  1. Sie müssen damit keine Arithmetik machen, und
  2. Früher oder später wird jemand versuchen, seine Vorwahl in Klammern zu setzen.

Im Allgemeinen verwende ich jedoch fast ausschließlich:

  • INT (11) für alles, was entweder eine ID ist oder auf eine andere ID verweist
  • DATETIME für Zeitstempel
  • VARCHAR (255) für alles, was garantiert weniger als 255 Zeichen enthält (Seitentitel, Namen usw.)
  • TEXT für so ziemlich alles andere.

Natürlich gibt es Ausnahmen, aber ich finde, dass dies die meisten Eventualitäten abdeckt.

da5id
quelle
2
Ganzzahlen unterstützen auch nur einen Wert von bis zu 2 Milliarden. Das sind 2.000.000.000. Was wirklich nicht genug Platz ist, wenn Sie internationale Telefonnummern mit Ländercode speichern möchten. Ich sehe nicht einmal, wie Sie genug Platz finden könnten, um eine Nummer wie 655-405-4055 (6.554.054.055) zu speichern
Kibbee
29
Außerdem ist es einfach falsch. Jemand, der viel weiser als ich war, sagte mir, als ich damit anfing (mit Datenbanken), nur weil etwas wie eine Zahl aussieht, heißt das nicht, dass es als solche behandelt wird oder behandelt werden sollte ...
da5id
14
Die blinde Verwendung von Varchar (255) ist eine schlechte Idee. Wenden Sie zumindest einige grundlegende Anstrengungen an, um die Länge zu erraten.
Morgan Tocker
4
@ Morgan Tocker: Es ist die beste Vorgehensweise, alles unter 255 Zeichen nimmt den gleichen Platz ein.
Raveren
7
@ Raveren: Dies ist speichermodulspezifisch - und Speicher sind nicht die einzigen Kosten. Beim Sortieren von Daten und temporären Tabellen (Speicher-Engine) wird der feste Betrag verwendet.
Morgan Tocker
44

Hier sind einige gängige Datentypen, die ich verwende (ich bin allerdings kein großer Profi):

| Column           | Data type     | Note
| ---------------- | ------------- | -------------------------------------
| id               | INTEGER       | AUTO_INCREMENT, UNSIGNED                                                          |  
| uuid             | CHAR(36)      | or CHAR(16) binary                                                                |  
| title            | VARCHAR(255)  |                                                                                   |  
| full name        | VARCHAR(70)   |                                                                                   |  
| gender           | TINYINT       | UNSIGNED                                                                          |  
| description      | TINYTEXT      | often may not be enough, use TEXT 
                                     instead          
| post body        | TEXT          |                                                                                   |  
| email            | VARCHAR(255)  |                                                                                   |  
| url              | VARCHAR(2083) | MySQL version < 5.0.3 - use TEXT                                                  |  
| salt             | CHAR(x)       | randomly generated string, usually of 
                                     fixed length (x)    
| digest (md5)     | CHAR(32)      |                                                                                   |  
| phone number     | VARCHAR(20)   |                                                                                   |  
| US zip code      | CHAR(5)       | Use CHAR(10) if you store extended 
                                     codes      
| US/Canada p.code | CHAR(6)       |                                                                                   |  
| file path        | VARCHAR(255)  |                                                                                   |  
| 5-star rating    | DECIMAL(3,2)  | UNSIGNED                                                                          |  
| price            | DECIMAL(10,2) | UNSIGNED                                                                          |  
| date (creation)  | DATE/DATETIME | usually displayed as initial date of 
                                     a post                                       |  
| date (tracking)  | TIMESTAMP     | can be used for tracking changes in a 
                                     post                                        |  
| tags, categories | TINYTEXT      | comma separated values *                                                          |  
| status           | TINYINT(1)    | 1  published, 0  unpublished,  You 
                                     can also use ENUM for human-readable 
                                     values
| json data        | JSON          | or LONGTEXT       
Yentsun
quelle
4
@yentsun - E-Mails sind eigentlich nur 254; Lesen Sie die Kommentare zu der Frage, die Neil McGuigan gepostet hat
RustyTheBoyRobot
16

Nach meiner Erfahrung sollten Vor- / Nachnamenfelder mindestens 48 Zeichen lang sein - es gibt Namen aus einigen Ländern wie Malaysia oder Indien, die in ihrer vollständigen Form sehr lang sind.

Telefonnummern und Postleitzahlen sollten Sie immer als Text behandeln, nicht als Nummern. Der normale Grund dafür ist, dass es Postleitzahlen gibt, die mit 0 beginnen, und in einigen Ländern können Telefonnummern auch mit 0 beginnen. Der wahre Grund ist jedoch, dass es sich nicht um Nummern handelt - es handelt sich um Kennungen , die zufällig erfunden werden von numerischen Ziffern (und das ignoriert Länder wie Kanada, deren Postleitzahlen Buchstaben enthalten). Speichern Sie sie also in einem Textfeld.

In MySQL können Sie VARCHAR-Felder für diese Art von Informationen verwenden. Es klingt zwar faul, bedeutet aber, dass Sie sich nicht zu viele Gedanken über die richtige Mindestgröße machen müssen.

staticsan
quelle
Um Ihren Kommentar zu Postleitzahlen in Ländern wie Großbritannien oder Kanada weiter zu unterstützen, sind Postleitzahlen alphanumerisch.
Andy Baird
Sie müssen möglicherweise über die richtige Mindestgröße stackoverflow.com/questions/262238/…
Rohit Banga
@iamrohitbanga Während Sie für genau definierte Daten korrekt sind, sind Namen VARCHAR(255)sinnvoll.
Statik
9

Da Sie mit Daten variabler Länge (Namen, E-Mail-Adressen) arbeiten, möchten Sie VARCHAR verwenden. Der von einem VARCHAR-Feld belegte Speicherplatz beträgt [field length]+ 1 Byte, bis zu einer maximalen Länge von 255, sodass ich mir keine Sorgen darüber machen muss, eine perfekte Größe zu finden. Schauen Sie sich an, was Ihrer Meinung nach die längste Länge sein könnte, verdoppeln Sie es und legen Sie es als Ihr VARCHAR-Limit fest. Das gesagt...:

Ich habe E-Mail-Felder im Allgemeinen auf VARCHAR (100) gesetzt - ich habe noch kein Problem damit. Namen, die ich auf VARCHAR (50) gesetzt habe.

Wie die anderen gesagt haben, sind Telefonnummern und Postleitzahlen keine numerischen Werte, sondern Zeichenfolgen mit den Ziffern 0-9 (und manchmal auch mehr!). Daher sollten Sie sie als Zeichenfolge behandeln. VARCHAR (20) sollte ausreichend sein.

Beachten Sie, dass viele Systeme davon ausgehen, dass eine Zahl, die mit 0 beginnt, eine Oktalzahl (Basis 8) ist, wenn Sie Telefonnummern als Ganzzahlen speichern! Daher wird die einwandfreie Telefonnummer "0731602412" als Dezimalzahl "124192010" in Ihre Datenbank aufgenommen !!

nickf
quelle
1

Ich mache ungefähr das Gleiche und hier ist, was ich getan habe.

Ich habe separate Tabellen für Name, Adresse, E-Mail-Adresse und Nummern verwendet, jede mit einer NameID-Spalte, die ein Fremdschlüssel für alles ist, außer für die Name-Tabelle, für die es sich um den primären Clusterschlüssel handelt. Ich habe MainName und FirstName anstelle von LastName und FirstName verwendet, um sowohl geschäftliche als auch persönliche Einträge zuzulassen, aber das ist möglicherweise nicht erforderlich.

Die NameID-Spalte wird in allen Tabellen zu einer Kleinigkeit, da ich ziemlich sicher bin, dass ich nicht mehr als 32000 Einträge machen werde. Fast alles andere ist varchar (n) und reicht von 20 bis 200, je nachdem, was Sie speichern möchten (Geburtstage, Kommentare, E-Mails, wirklich lange Namen). Das hängt wirklich davon ab, welche Art von Material Sie aufbewahren.

In der Zahlentabelle weiche ich davon ab. Ich habe es so eingerichtet, dass es fünf Spalten mit den Namen NameID, Telefonnummer, CountryCode, Nebenstelle und Telefontyp enthält. Ich habe bereits über NameID gesprochen. Telefonnummer ist varchar (12) mit einer Prüfbedingung, die ungefähr so ​​aussieht: CHECK (Telefonnummer wie '[0-9] [0-9] [0-9] - [0-9] [0-9] [0 -9] - [0-9] [0-9] [0-9] [0-9] '). Dies stellt sicher, dass nur das, was ich will, in die Datenbank gelangt und die Daten sehr konsistent bleiben. Die Nebenstellen- und Ländercodes nannte ich nullable smallints, aber diese könnten varchar sein, wenn Sie wollten. PhoneType ist varchar (20) und kann nicht auf Null gesetzt werden.

Hoffe das hilft!

Thomas
quelle