MySQL
Gegevenstypen
Zoeken…
Impliciete / automatische casting
select '123' * 2;
Om de vermenigvuldiging met 2
te maken, zet MySQL automatisch de string 123
in een getal.
Winstwaarde:
246
De conversie naar een nummer begint van links naar rechts. Als de conversie niet mogelijk is, is het resultaat 0
select '123ABC' * 2
Winstwaarde:
246
select 'ABC123' * 2
Winstwaarde:
0
VARCHAR (255) - of niet
Voorgestelde max len
Eerst zal ik enkele veel voorkomende tekenreeksen noemen die altijd hex zijn of anderszins beperkt tot ASCII. Hiervoor moet u CHARACTER SET ascii
opgeven ( latin1
is ok) zodat er geen ruimte wordt verspild:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
Waarom niet gewoon 255? Er zijn twee redenen om het gebruik van (255) voor alles te vermijden.
- Wanneer een complexe
SELECT
tijdelijke tabel moet maken (voor een subquery,UNION
,GROUP BY
, enz.), Heeft de voorkeur de voorkeur om deMEMORY
engine te gebruiken, die de gegevens in RAM plaatst. MaarVARCHARs
worden in het proces omgezet inCHAR
. Dit maakt datVARCHAR(255) CHARACTER SET utf8mb4
1020 bytes inVARCHAR(255) CHARACTER SET utf8mb4
neemt. Dat kan ertoe leiden dat u naar schijf moet morsen, wat langzamer is. - In bepaalde situaties zal InnoDB de potentiële grootte van de kolommen in een tabel bekijken en beslissen dat deze te groot zal zijn, waardoor een
CREATE TABLE
wordt afgebroken.
VARCHAR versus TEKST
Gebruikstips voor *TEXT
, CHAR
en VARCHAR
, plus enkele praktische tips:
- Gebruik nooit
TINYTEXT
. - Gebruik bijna nooit
CHAR
- het heeft een vaste lengte; elk karakter is de maximale lengte van deCHARACTER SET
(bijv. 4 bytes / karakter voor utf8mb4). - Gebruik
CHARACTER SET ascii
metCHAR
, tenzij u iets anders weet. -
VARCHAR(n)
wordt afgekapt bij n tekens ;TEXT
wordt afgekapt met een aantal bytes . (Maar wil je truncatie?) -
*TEXT
kan complexeSELECTs
vanwege de manier waarop tijdelijke tabellen worden verwerkt.
INT als AUTO_INCREMENT
Elke grootte van INT
kan worden gebruikt voor AUTO_INCREMENT
. UNSIGNED
is altijd passend.
Houd er rekening mee dat bepaalde bewerkingen AUTO_INCREMENT
id's "verbranden". Dit kan leiden tot een onverwachte kloof. Voorbeelden: INSERT IGNORE
en REPLACE
. Ze kunnen een ID vooraf toewijzen voordat ze zich realiseren dat het niet nodig is. Dit is verwacht gedrag en door het ontwerp in de InnoDB-motor en mag het gebruik ervan niet ontmoedigen.
anderen
Er is al een afzonderlijk item voor "FLOAT, DOUBLE en DECIMAL" en "ENUM". Een enkele pagina over gegevenstypen is waarschijnlijk onhandig - ik stel voor dat "Veldtypen" (of moet het "Datatypes" worden genoemd?) Een overzicht zijn en dan worden opgesplitst in deze onderwerppagina's:
- INTs
- DOBBER, DUBBEL en DECIMAAL
- Tekenreeksen (CHAR's, TEKST, enz.)
- BINARY en BLOB
- DATETIME, TIMESTAMP en vrienden
- ENUM en SET
- Ruimtelijke gegevens
- JSON type (MySQL 5.7.8+)
- Hoe geld te vertegenwoordigen, en andere veel voorkomende 'soorten' die schoenhoornen in bestaande gegevenstypen nodig hebben
In voorkomend geval moet elke onderwerppagina naast de syntaxis en voorbeelden bevatten:
- Overwegingen bij het WIJZIGEN
- Grootte (bytes)
- Contrast met niet-MySQL-engines (lage prioriteit)
- Overwegingen bij het gebruik van het gegevenstype in een PRIMAIRE SLEUTEL of secundaire sleutel
- andere best practices
- andere prestatieproblemen
(Ik neem aan dat dit "voorbeeld" zichzelf zal vernietigen wanneer aan mijn suggesties is voldaan of een veto is gegeven.)
Introductie (numeriek)
MySQL biedt een aantal verschillende numerieke typen. Deze kunnen worden onderverdeeld in
Groep | Types |
---|---|
Geheel getaltypen | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Vaste punttypen | DECIMAL , NUMERIC |
Floating Point Types | FLOAT , DOUBLE |
Type bitwaarde | BIT |
Geheel getaltypen
Minimale niet-ondertekende waarde is altijd 0.
Type | opslagruimte (Bytes) | Minimale waarde (Wg) | Maximale waarde (Wg) | Maximale waarde (Unsigned) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 -32.768 | 2 15 -1 32.767 | 2 16 -1 65.535 |
MEDIUMINT | 3 | -2 23 -8.388.608 | 2 23 -1 8.388.607 | 2 24 -1 16,777,215 |
INT | 4 | -2 31 -2.147.483.648 | 2 31 -1 2,147,483,647 | 2 32 -1 4294967295 |
BIGINT | 8 | -2 63 -9.223.372.036.854.775.808 | 2 63 -1 9.223.372.036.854.775.807 | 2 64 -1 18.446.744.073.709.551.615 |
Vaste punttypen
De DECIMAL
en NUMERIC
typen van MySQL slaan exacte numerieke gegevenswaarden op. Het wordt aanbevolen om deze typen te gebruiken om exacte precisie te behouden, bijvoorbeeld voor geld.
Decimale
Deze waarden worden opgeslagen in binair formaat. In een kolomaangifte moeten de precisie en de schaal worden gespecificeerd
Precisie vertegenwoordigt het aantal significante cijfers dat is opgeslagen voor waarden.
Schaal staat voor het aantal cijfers dat achter de komma is opgeslagen
salary DECIMAL(5,2)
5 staat voor de precision
en 2 staat voor de scale
. Voor dit voorbeeld is het bereik van waarden die in deze kolom kunnen worden opgeslagen -999.99 to 999.99
Als de parameter schaal wordt weggelaten, wordt deze standaard ingesteld op 0
Dit gegevenstype kan maximaal 65 cijfers opslaan.
Het aantal bytes ingenomen door DECIMAL(M,N)
is ongeveer M/2
.
Floating Point Types
FLOAT
en DOUBLE
vertegenwoordigen bij benadering gegevenstypen.
Type | opslagruimte | precisie | reeks |
---|---|---|---|
VLOTTER | 4 bytes | 23 significante bits / ~ 7 decimale cijfers | 10 ^ + / - 38 |
DUBBELE | 8 bytes | 53 significante bits / ~ 16 decimale cijfers | 10 ^ + / - 308 |
REAL
is een synoniem voor FLOAT
. DOUBLE PRECISION
is een synoniem voor DOUBLE
.
Hoewel MySQL maakt ook (M, D) qualifier, niet gebruiken. (M, D) betekent dat waarden kunnen worden opgeslagen met maximaal M totale cijfers, waarbij D achter de komma kan staan. Getallen worden twee keer afgerond of afgekapt; dit levert meer problemen op dan voordeel.
Omdat waarden met drijvende komma bij benadering zijn en niet als exacte waarden worden opgeslagen, kunnen pogingen om ze in vergelijkingen als exact te behandelen tot problemen leiden. Merk met name op dat een FLOAT
waarde zelden gelijk is aan een DOUBLE
waarde.
Type bitwaarde
Het BIT
type is handig voor het opslaan van bitveldwaarden. BIT(M)
maakt opslag mogelijk van maximaal M-bit waarden waarbij M in het bereik van 1 to 64
U kunt ook waarden opgeven met bit value
notatie.
b'111' -> 7
b'10000000' -> 128
Soms is het handig om 'shift' te gebruiken om een waarde van één bit te construeren, bijvoorbeeld (1 << 7)
voor 128.
De maximale gecombineerde grootte van alle BIT-kolommen in een NDB
tabel is 4096.
CHAR (n)
CHAR(n)
is een tekenreeks met een vaste lengte van n
tekens . Als het CHARACTER SET utf8mb4
, betekent dit dat het exact 4*n
bytes in beslag neemt, ongeacht welke tekst erin staat.
De meeste gebruiksscenario's voor CHAR(n)
bevatten tekenreeksen die Engelse tekens bevatten en moeten daarom CHARACTER SET ascii
. ( latin1
doet het net zo goed.)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATUM, DATETIME, TIMESTAMP, JAAR en TIJD
Het datatype DATE
bevat de datum maar geen tijdcomponent. Het formaat is 'YYYY-MM-DD'
met een bereik van '1000-01-01' tot '9999-12-31'.
Het DATETIME
type omvat de tijd met een notatie van 'JJJJ-MM-DD HH: MM: SS'. Het heeft een bereik van '1000-01-01 00:00:00' tot '9999-12-31 23:59:59'.
Het TIMESTAMP
type is een geheel getal met een datum en tijd met een effectief bereik van '1970-01-01 00:00:01' UTC tot '2038-01-19 03:14:07' UTC.
Het YEAR
type vertegenwoordigt een jaar en heeft een bereik van 1901 tot 2155.
Het type TIME
staat voor een tijd met de notatie 'HH: MM: SS' en heeft een bereik van '-838: 59: 59' tot '838: 59: 59'.
Opslagvereisten:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
Fractionele seconden (vanaf versie 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Zie de MySQL-handleidingpagina's DATUM, DATETIJD en TIJDSTAMPTypes, opslagvereisten voor gegevenstype en fractionele seconden in tijdswaarden .