MySQL
Datentypen
Suche…
Implizites / automatisches Casting
select '123' * 2;
Um die Multiplikation mit 2
durchzuführen, wandelt MySQL die Zeichenfolge 123
automatisch in eine Zahl um.
Rückgabewert:
246
Die Umwandlung in eine Nummer beginnt von links nach rechts. Wenn die Konvertierung nicht möglich ist, lautet das Ergebnis 0
select '123ABC' * 2
Rückgabewert:
246
select 'ABC123' * 2
Rückgabewert:
0
VARCHAR (255) - oder nicht
Vorgeschlagene max len
Zuerst werde ich einige gängige Zeichenfolgen erwähnen, die immer hexadezimal sind oder sonst auf ASCII beschränkt sind. Für diese sollten Sie CHARACTER SET ascii
( latin1
ist ok) angeben, damit kein Platz verschwendet wird:
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
Warum nicht einfach 255? Es gibt zwei Gründe, die übliche Verwendung von (255) für alles zu vermeiden.
- Wenn ein komplexes
SELECT
eine temporäre Tabelle erstellen muss (für eine Unterabfrage,UNION
,GROUP BY
usw.), wird die Verwendung derMEMORY
Engine bevorzugt, die die Daten in den RAM-Speicher setzt.VARCHARs
werden dabei jedoch inCHAR
. Dadurch nimmtVARCHAR(255) CHARACTER SET utf8mb4
1020 Byte an. Dies kann dazu führen, dass auf die Festplatte verschüttet werden muss, was langsamer ist. - In bestimmten Situationen prüft InnoDB die mögliche Größe der Spalten in einer Tabelle und entscheidet, dass diese zu groß ist, und eine
CREATE TABLE
wird abgebrochen.
VARCHAR versus TEXT
Hinweise zur Verwendung von *TEXT
, CHAR
und VARCHAR
sowie einige CHAR
VARCHAR
:
- Verwenden
TINYTEXT
niemalsTINYTEXT
. - Verwenden Sie fast nie
CHAR
- es ist eine feste Länge; Jedes Zeichen ist die maximale Länge desCHARACTER SET
(zB 4 Bytes / Zeichen für utf8mb4). - Verwenden Sie bei
CHAR
CHARACTER SET ascii
sofern Sie nichts anderes wissen. -
VARCHAR(n)
wird bei n Zeichen abgeschnitten.TEXT
wird bei einigen Bytes abgeschnitten. (Aber willst du abgeschnitten werden?) -
*TEXT
kann komplexeSELECTs
verlangsamen,SELECTs
Temp-Tabellen behandelt werden.
INT als AUTO_INCREMENT
Für AUTO_INCREMENT
kann eine beliebige Größe von INT
verwendet werden. UNSIGNED
ist immer angemessen.
Denken Sie daran, dass bestimmte Operationen AUTO_INCREMENT
IDs "verbrennen". Dies könnte zu einer unerwarteten Lücke führen. Beispiele: INSERT IGNORE
und REPLACE
. Sie können eine ID vorbelegen, bevor sie feststellen, dass sie nicht benötigt wird. Dies ist das erwartete Verhalten und Design der InnoDB-Engine und sollte deren Verwendung nicht abschrecken.
Andere
Es gibt bereits einen separaten Eintrag für "FLOAT, DOUBLE und DECIMAL" und "ENUM". Eine einzige Seite mit Datentypen ist wahrscheinlich unhandlich. Ich schlage vor, "Feldtypen" (oder sollte "Datentypen" heißen?), Um eine Übersicht zu erhalten.
- INTs
- FLOAT, DOUBLE und DECIMAL
- Zeichenfolgen (Zeichen, Text usw.)
- BINARY und BLOB
- DATETIME, TIMESTAMP und Freunde
- ENUM und SET
- Räumliche Daten
- JSON-Typ (MySQL 5.7.8 und höher)
- So stellen Sie Money und andere gängige Typen dar, die in vorhandene Datentypen eingebettet werden müssen
Gegebenenfalls sollte jede Themenseite neben Syntax und Beispielen Folgendes enthalten:
- Überlegungen beim ALTERing
- Größe (Bytes)
- Kontrast zu Nicht-MySQL-Engines (niedrige Priorität)
- Überlegungen zur Verwendung des Datentyps in einem PRIMARY KEY oder einem sekundären Schlüssel
- andere Best Practice
- andere Performance-Probleme
(Ich gehe davon aus, dass dieses "Beispiel" sich selbst zerstören wird, wenn meine Vorschläge erfüllt oder ein Veto eingelegt wurden.)
Einleitung (numerisch)
MySQL bietet eine Reihe verschiedener numerischer Typen. Diese können in zerlegt werden
Gruppe | Typen |
---|---|
Integer-Typen | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Feste Punkttypen | DECIMAL , NUMERIC |
Fließkomma-Typen | FLOAT , DOUBLE |
Bitwerttyp | BIT |
Integer-Typen
Minimaler vorzeichenloser Wert ist immer 0.
Art | Lager (Bytes) | Mindestwert (Unterzeichnet) | Höchster Wert (Unterzeichnet) | Höchster Wert (Ohne Vorzeichen) |
---|---|---|---|---|
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 4,294,967,295 |
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 |
Feste Punkttypen
Die DECIMAL
und NUMERIC
Typen von MySQL speichern genaue numerische Datenwerte. Es wird empfohlen, diese Typen zu verwenden, um die exakte Genauigkeit zu erhalten, z. B. für Geld.
Dezimal
Diese Werte werden im Binärformat gespeichert. In einer Spaltendeklaration sollten die Genauigkeit und der Maßstab angegeben werden
Präzision steht für die Anzahl der signifikanten Stellen, die für Werte gespeichert werden.
Skala steht für die Anzahl der nach der Dezimalstelle gespeicherten Ziffern
salary DECIMAL(5,2)
5 steht für die precision
und 2 für die scale
. In diesem Beispiel liegt der Wertebereich, der in dieser Spalte gespeichert werden kann, zwischen -999.99 to 999.99
Wenn der Waagenparameter weggelassen wird, ist der Standardwert 0
Dieser Datentyp kann bis zu 65 Ziffern speichern.
Die Anzahl der von DECIMAL(M,N)
Bytes beträgt ungefähr M/2
.
Fließkomma-Typen
FLOAT
und DOUBLE
repräsentieren ungefähre Datentypen.
Art | Lager | Präzision | Angebot |
---|---|---|---|
SCHWEBEN | 4 Bytes | 23 signifikante Bits / ~ 7 Dezimalstellen | 10 ^ + / - 38 |
DOPPELT | 8 Bytes | 53 signifikante Bits / ~ 16 Dezimalstellen | 10 ^ + / - 308 |
REAL
ist ein Synonym für FLOAT
. DOUBLE PRECISION
ist ein Synonym für DOUBLE
.
Obwohl MySQL erlaubt auch (M, D) , Qualifier, verwenden Sie es nicht. (M, D) bedeutet, dass Werte mit bis zu M Gesamtziffern gespeichert werden können, wobei D nach dem Dezimalzeichen liegen kann. Zahlen werden zweimal gerundet oder abgeschnitten; Dies verursacht mehr Probleme als Nutzen.
Da Gleitkommawerte nur Näherungswerte sind und nicht als exakte Werte gespeichert werden, können Versuche, sie bei Vergleichen als exakt zu behandeln, zu Problemen führen. Beachten Sie insbesondere, dass ein FLOAT
Wert selten einem DOUBLE
Wert entspricht.
Bitwerttyp
Der BIT
Typ ist zum Speichern von BIT
nützlich. BIT(M)
erlaubt das Speichern von bis zu M-Bit-Werten, wobei M im Bereich von 1 to 64
Sie können Werte auch mit bit value
angeben.
b'111' -> 7
b'10000000' -> 128
Manchmal ist es praktisch, "shift" zu verwenden, um einen Einzelbit-Wert zu (1 << 7)
, beispielsweise (1 << 7)
für 128.
Die maximale Gesamtgröße aller BIT-Spalten in einer NDB
Tabelle beträgt 4096.
CHAR (n)
CHAR(n)
ist eine Zeichenfolge mit einer festen Länge von n
Zeichen . Wenn es sich um CHARACTER SET utf8mb4
, belegt dies genau 4*n
Bytes , unabhängig davon, welcher Text darin enthalten ist.
Bei den meisten Anwendungsfällen für CHAR(n)
um Zeichenfolgen, die englische Zeichen enthalten. Daher sollten sie CHARACTER SET ascii
. ( latin1
wird genauso gut sein.)
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 und TIME
Der DATE
Datentyp umfasst das Datum, jedoch keine Zeitkomponente. Das Format ist 'YYYY-MM-DD'
mit einem Bereich von '1000-01-01' bis '9999-12-31'.
Der DATETIME
Typ enthält die Uhrzeit im Format 'JJJJ-MM-TT HH: MM: SS'. Es hat einen Bereich von '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'.
Der TIMESTAMP
Typ ist ein ganzzahliger Typ, der Datum und Uhrzeit mit einem Wirkungsbereich von '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC umfasst.
Der YEAR
Typ steht für ein Jahr und reicht von 1901 bis 2155.
Der TIME
Typ repräsentiert eine Zeit mit einem Format von 'HH: MM: SS' und enthält einen Bereich von '-838: 59: 59' bis '838: 59: 59'.
Lagerungssansprüche:
|-----------|--------------------|----------------------------------------|
| 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 |
|-----------|--------------------|----------------------------------------|
Sekundenbruchteile (ab Version 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Siehe die MySQL-Handbuchseiten DATE, DATETIME und TIMESTAMP , Datenspeicheranforderungen und Sekundenbruchteile in Zeitwerten .