MySQL - datatyper

Datatyper

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

Værdier

Integers - heltal

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

Decimaltal

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
Forskel på videnskabelig og "almindelige" tal

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

Tekststrenge

Varchar

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

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.

Enum

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

Tid

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