Herunder kan du se de mest anvendte datatyper.
Læs mere: http://dev.mysql.com/doc/refman/5.7/en/data-types.html
Læs mere: http://www.w3schools.com/sql/sql_datatypes.asp
Datatype | Størrelse (byte) |
UNSIGNED | |||
---|---|---|---|---|---|
Min. værdi | Maks. værdi | Min. værdi | Maks. værdi | ||
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32.768 | 32.767 | 0 | 65.535 |
MEDIUMINT | 3 | -8.388.608 | 8.388.607 | 0 | 16.777.215 |
INT | 4 | -2.147.483.648 | 2.147.483.647 | 0 | 4.294.967.295 |
For at præcisere dine tal kan man "låse" antallet af cifre ved at angive det i en parentes. F.eks. vil SMALLINT(4) gøre, at feltet maksimalt kan indeholde 4 cifre. Det eneste du skal være opmærksom på er, at man ikke kan overskride antallet af cifre i den type man anvender f.eks: TINYINT(4), da typens maksimale værdi er 255.
Læs mere om heltal: http://dev.mysql.com/doc/refman/5.7/en/integer-types.html
Der findes to metoder til at anvende decimaltal. Den ene er binær og den anden er baseret på 10 talsystemet. Grunden til at man anvender to forskellige er, den hastighed systemet kan anvende tallene med og belastningen af CPU'en. Computeren er hurtigere til at regne med binære tal end tal fra 10 talsystemet. Se nedenstående skema:
Datatype | Størrelse (byte) |
Talsystem | Antal cifre/decimaler (præcission) | Anvendelsesområde | Nøjagtighed |
---|---|---|---|---|---|
FLOAT | 4 | Binær | ∼ 7 decimaler | Videnskabeligt | Præcis |
DOUBLE | 8 | Binær | ∼ 14 decimaler | Videnskabeligt | Præcis |
Decimal | - | 10 | 65 cifre, maks. 30 decimaler | Finansiel | Eksakt |
Videnskabelige tal angives ved hjælp af et heltal efterfulgt af en 10'er potens der angiver kommaets position f.eks. som ved Faradays konstant (F' = 9,6485309 ⋅ 104 C/mol). I decimaltal vil det være 96485,309 C/mol. Det som er problemet med det tal jeg skriver her er, at det reelt kun er præcist ned til den 7'ende decimal. Det er rigeligt i videnskabelig sammenhæng, men kan være mangelfuldt i andre sammenhænge f.eks. finansielle beregninger. Dette er årsagen til, at FLOAT og DOUBLE bliver angivet som værende præcise, og DECIMAL til at være eksakt.
Her er et eksempel hvor der anvendes float i Python:
>>> 3*0.1 0.30000000000000004 <-- Tallet burde give 0,3 >>> 3*0.1-0.3 5.551115123125783e-17 <-- Tallet burde give 0
Læg mærke til at 3*0.1 ikke giver 3.0 som vi forventer det. Læg også mærke til at hvis vi tager samme regnestykke og trækker 0.3 fra, så giver det ikke 4.xxxe-17 som vi ville forvente efter forrige regnestykke. Det skyldes at Python regner med float, og derfor kun kan lave en binær repræsentation af decimaltallet.
Sagt på en anden måde. FLOAT og DOUBLE er præcise nok til at arbejde med tal, hvor der kun er brug for et mindre antal decimaler (videnskab), men ikke når der er brug for mange (finans).
Ligesom ved heltallene kan decimaltallene også præciseres (låses) ved hjælp af at angive antallet af cifre og decimaler i en parantes bagefter f.eks: DECIMAL(10,4). Det svarer til 10 cifre hvoraf de 4 er decimaler f.eks: 345987,4563
Læs mere: http://code.rohitink.com/2013/06/12/mysql-integer-float-decimal-data-types-differences/
Om FLOAT og DOUBLE: http://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html
Om DECIMAL: http://dev.mysql.com/doc/refman/5.7/en/fixed-point-types.html
VARCHAR(*antal_tegn*) gemmer op til det antal tegn (0-65635) der bliver sat i parentesen. Se skemaet herunder:
Tekststreng | VARCHAR(5) | Beskrivelse |
---|---|---|
'' | '' | Ingen tegn bliver glemt |
'abc' | 'abc' | abc bliver gemt |
'abcdefgh' | 'abcde' | fgh bliver ikke gemt da det er udover de 5 tegn. |
Felternes størrelse er afhængig af indholdet
Læs mere: http://dev.mysql.com/doc/refman/5.7/en/char.html
CHAR(*antal_tegn*) gemmer det antal tegn (0-255) der bliver sat i parentesen. Se skemaet herunder:
Tekststreng | CHAR(5) | Beskrivelse |
---|---|---|
'' | ' ' | 5 tomme tegn. |
'abc' | 'abc ' | abc og 2 tomme tegn. |
'abcdefgh' | 'abcde' | fgh bliver ikke gemt da det er udover de 5 tegn. |
Felternes størrelse er afhængig af værdien der er sat.
Læs mere: http://dev.mysql.com/doc/refman/5.7/en/char.html
Hvornår anvende VARCHAR() og CHAR()Hvis man er i tvivl bør man altid anvende VARCHAR(). Kan man holde alle sine data til CHAR() kan det i nogle tilfælde give en hastighedsfordel, men det kræver igen store databaser før det er en reel effekt.
Med ENUM() kan man angive nogle foruddefinerede værdier som feltet kan indeholde. Det kan f.eks. være tøjstørrelser: ENUM('X-SMALL','SMALL','MEDIUM','LARGE','X-LARGE','XX-LARGE'). Fordelen ved at anvende ENUM() til at lagre værdier er, at de fylder langt mindre end VARCHAR, da værdierne bliver gemt i feltet som et tal der henviser til den konkrete tekststreng. 0 → X_SMALL, 1 → SMALL, 2 → MEDIUM osv.
Læs mere: http://dev.mysql.com/doc/refman/5.7/en/enum.html
Datatype | Format | Første værdi | Sidste værdi | Opdaterbar |
---|---|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | Nej |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | Ja |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 | 2038-01-19 03:14:07 | Ja |
TIME | HHH:MM:SS | -838:59:59 | 838:59:59 | Nej |
YEAR | YYYY | 1901 | 2155 | Nej |
YYYY = År , MM = måned , DD= dag , HH = timer , MM = minutter , SS = sekunder |
DATETIME og TIMESTAMP kan sættes til at opdatere automatisk når en post bliver bliver oprettet eller ændret. Begge datatyper kan også tilføjes en værdi for dele af sekundet til en præcision på mikrosekunder (6 decimaler). Det gøres ved at indsætte præcisionen i en parentes efter datatypen f.eks: DATETIME(3), hvilket angiver tusindedele af et sekund.
Læs mere: http://dev.mysql.com/doc/refman/5.7/en/datetime.html