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 de MEMORY engine te gebruiken, die de gegevens in RAM plaatst. Maar VARCHARs worden in het proces omgezet in CHAR . Dit maakt dat VARCHAR(255) CHARACTER SET utf8mb4 1020 bytes in VARCHAR(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 de CHARACTER SET (bijv. 4 bytes / karakter voor utf8mb4).
  • Gebruik CHARACTER SET ascii met CHAR , 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 complexe SELECTs 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 .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow