MySQL
Datatyper
Sök…
Implicit / automatisk gjutning
select '123' * 2;
För att göra multiplikationen med 2
konverterar MySQL automatiskt strängen 123
till ett nummer.
Returvärde:
246
Konverteringen till ett nummer startar från vänster till höger. Om omvandlingen inte är möjlig är resultatet 0
select '123ABC' * 2
Returvärde:
246
select 'ABC123' * 2
Returvärde:
0
VARCHAR (255) - eller inte
Föreslagen max len
Först kommer jag att nämna några vanliga strängar som alltid är hex, eller på annat sätt begränsade till ASCII. För dessa bör du ange CHARACTER SET ascii
( latin1
är ok) så att det inte slösar utrymme:
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
Varför inte bara 255? Det finns två skäl att undvika vanligt att använda (255) för allt.
- När ett komplex
SELECT
behöver skapa en tillfällig tabell (för en undersökning,UNION
,GROUP BY
, etc.) är det föredragna valet att användaMEMORY
motorn, som sätter data i RAM. MenVARCHARs
förvandlas tillCHAR
i processen. Detta gör attVARCHAR(255) CHARACTER SET utf8mb4
tar 1020 byte. Det kan leda till att man behöver spilla till disken, vilket är långsammare. - I vissa situationer kommer InnoDB att titta på den potentiella storleken på kolumnerna i en tabell och bestämma att den blir för stor och avbryter en
CREATE TABLE
.
VARCHAR kontra TEXT
Tips om användning av *TEXT
, CHAR
och VARCHAR
, plus några bästa metoder:
-
TINYTEXT
aldrigTINYTEXT
. -
CHAR
nästan aldrigCHAR
- det är fast längd; varje tecken är den maximala längden förCHARACTER SET
(t.ex. 4 byte / tecken för utf8mb4). -
CHAR
, användCHARACTER SET ascii
om du inte vet något annat. -
VARCHAR(n)
trunkeras vid n tecken ;TEXT
kommer att avkortas vid ett antal byte . (Men vill du ha trunkering?) -
*TEXT
kan bromsa komplexaSELECTs
grund av hur temp-tabeller hanteras.
INT som AUTO_INCREMENT
Alla storlekar på INT
kan användas för AUTO_INCREMENT
. UNSIGNED
är alltid lämpligt.
Tänk på att vissa operationer "bränner" AUTO_INCREMENT
id. Detta kan leda till ett oväntat gap. Exempel: INSERT IGNORE
och REPLACE
. De kan förflytta en id innan de inser att det inte kommer att behövas. Detta förväntas beteende och genom design i InnoDB-motorn och bör inte avskräcka deras användning.
Övriga
Det finns redan en separat post för "FLOAT, DUBBLE and DECIMAL" och "ENUM". En enda sida om datatyper är troligtvis olämplig - jag föreslår att "Fälttyper" (eller ska det kallas "Datatyper"?) Är en översikt och dela sedan in i dessa ämnesidor:
- INTs
- FLOAT, DUBBELT och DECIMAL
- Strängar (CHARs, TEXT, etc)
- BINARY och BLOB
- DATETIME, TIMESTAMP och vänner
- ENUM och SET
- Rumsliga data
- JSON-typ (MySQL 5.7.8+)
- Hur man representerar pengar och andra vanliga ”typer” som behöver skogsskydd i befintliga datatyper
I förekommande fall bör varje ämnesida, förutom syntax och exempel, innehålla:
- Överväganden vid ALTERING
- Storlek (byte)
- Kontrast med icke-MySQL-motorer (låg prioritet)
- Överväganden när du använder datatypen i en PRIMÄRKNAPP eller sekundärnyckel
- andra bästa praxis
- andra resultatfrågor
(Jag antar att detta "exempel" kommer att förstöra sig när mina förslag har varit nöjda eller veto.)
Introduktion (numerisk)
MySQL erbjuder ett antal olika numeriska typer. Dessa kan delas upp i
Grupp | typer |
---|---|
Heltalstyper | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Fastpunkttyper | DECIMAL , NUMERIC |
Flytande punkttyper | FLOAT , DOUBLE |
Typ av bitvärde | BIT |
Heltalstyper
Minimalt osignerat värde är alltid 0.
Typ | Lagring (Byte) | Minsta värde (Signerad) | Maximalt värde (Signerad) | Maximalt värde (Osignerad) |
---|---|---|---|---|
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 -2147483648 | 2 31 -1 2147483647 | 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 |
Fastpunkttyper
MySQL: s DECIMAL
och NUMERIC
typer lagrar exakta numeriska datavärden. Det rekommenderas att använda dessa typer för att bevara exakt precision, till exempel för pengar.
Decimal
Dessa värden lagras i binärt format. I en kolumndeklaration ska precisionen och skalan anges
Precision representerar antalet betydande siffror som lagras för värden.
Skala representerar antalet siffror som lagras efter decimalen
salary DECIMAL(5,2)
5 representerar precision
och 2 representerar scale
. I det här exemplet är värdena som kan lagras i denna kolumn -999.99 to 999.99
Om skalparametern utelämnas är standardvärdet 0
Denna datatyp kan lagra upp till 65 siffror.
Antalet byte som tas av DECIMAL(M,N)
är ungefär M/2
.
Flytande punkttyper
FLOAT
och DOUBLE
representerar ungefärliga datatyper.
Typ | Lagring | Precision | Räckvidd |
---|---|---|---|
FLYTA | 4 bytes | 23 betydande bitar / ~ 7 decimaler | 10 ^ + / - 38 |
DUBBEL | 8 byte | 53 betydande bitar / ~ 16 decimaler | 10 ^ + / - 308 |
REAL
är en synonym för FLOAT
. DOUBLE PRECISION
är en synonym för DOUBLE
.
Även MySQL tillåter också (M, D) kval, inte använda den. (M, D) betyder att värden kan lagras med upp till M-siffror, där D kan vara efter decimal. Siffrorna rundas två gånger eller trunkeras; detta kommer att orsaka mer problem än nytta.
Eftersom flytpunktsvärden är ungefärliga och inte lagras som exakta värden, kan försök att behandla dem som exakta i jämförelser leda till problem. Observera särskilt att ett FLOAT
värde sällan är lika med ett DOUBLE
värde.
Typ av bitvärde
BIT
typen är användbar för att lagra bitfältvärden. BIT(M)
tillåter lagring av upp till M-bitvärden där M är i intervallet 1 to 64
Du kan också ange värden med bit value
.
b'111' -> 7
b'10000000' -> 128
Ibland är det praktiskt att använda 'shift' för att konstruera ett enbitsvärde, till exempel (1 << 7)
för 128.
Den maximala kombinerade storleken på alla BIT-kolumner i en NDB
tabell är 4096.
CHAR (n)
CHAR(n)
är en sträng med en fast längd på n
tecken . Om det är CHARACTER SET utf8mb4
, betyder det att det upptar exakt 4*n
byte , oavsett vilken text som finns i den.
De flesta fall som används för CHAR(n)
involverar strängar som innehåller engelska tecken, därför bör CHARACTER SET ascii
. ( latin1
kommer att göra lika bra.)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATE, DATETIME, TIMESTAMP, YEAR och TIME
DATE
DATE innehåller datum men ingen tidskomponent. Dess format är 'YYYY-MM-DD'
med ett intervall '1000-01-01' till '9999-12-31'.
DATETIME
typen inkluderar tiden med ett format "YYYY-MM-DD HH: MM: SS". Det har ett intervall från '1000-01-01 00:00:00' till '9999-12-31 23:59:59'.
TIMESTAMP
typen är en heltalstyp som innehåller datum och tid med ett effektivt intervall från '1970-01-01 00:00:01' UTC till '2038-01-19 03:14:07' UTC.
YEAR
typen representerar ett år och har ett intervall från 1901 till 2155.
TIME
typen representerar en tid med ett format av 'HH: MM: SS' och har ett intervall från '-838: 59: 59' till '838: 59: 59'.
Lagringskrav:
|-----------|--------------------|----------------------------------------|
| 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 |
|-----------|--------------------|----------------------------------------|
Fraktionssekunder (från version 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Se MySQL manualsidor DATE, DATETIME och tidsstämpel typer , Datatyp Lagring Krav och Fractional sekunder i tidsvärden .