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 der MEMORY Engine bevorzugt, die die Daten in den RAM-Speicher setzt. VARCHARs werden dabei jedoch in CHAR . Dadurch nimmt VARCHAR(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 niemals TINYTEXT .
  • Verwenden Sie fast nie CHAR - es ist eine feste Länge; Jedes Zeichen ist die maximale Länge des CHARACTER 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 komplexe SELECTs 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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow