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
SELECTeine temporäre Tabelle erstellen muss (für eine Unterabfrage,UNION,GROUP BYusw.), wird die Verwendung derMEMORYEngine bevorzugt, die die Daten in den RAM-Speicher setzt.VARCHARswerden dabei jedoch inCHAR. Dadurch nimmtVARCHAR(255) CHARACTER SET utf8mb41020 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 TABLEwird abgebrochen.
VARCHAR versus TEXT
Hinweise zur Verwendung von *TEXT , CHAR und VARCHAR sowie einige CHAR VARCHAR :
- Verwenden
TINYTEXTniemalsTINYTEXT. - 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
CHARCHARACTER SET asciisofern Sie nichts anderes wissen. -
VARCHAR(n)wird bei n Zeichen abgeschnitten.TEXTwird bei einigen Bytes abgeschnitten. (Aber willst du abgeschnitten werden?) -
*TEXTkann komplexeSELECTsverlangsamen,SELECTsTemp-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 .