MySQL
Typy danych
Szukaj…
Rzut bezpośredni / automatyczny
select '123' * 2;
Aby wykonać mnożenie przez 2
MySQL automatycznie konwertuje ciąg 123
na liczbę.
Zwracana wartość:
246
Konwersja na liczbę rozpoczyna się od lewej do prawej. Jeśli konwersja nie jest możliwa, wynikiem jest 0
select '123ABC' * 2
Zwracana wartość:
246
select 'ABC123' * 2
Zwracana wartość:
0
VARCHAR (255) - czy nie
Sugerowana maksymalna długość
Najpierw wspomnę o niektórych typowych ciągach, które zawsze są szesnastkowe lub w inny sposób ograniczone do ASCII. W tym przypadku należy podać CHARACTER SET ascii
( latin1
jest w porządku), aby nie marnował miejsca:
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
Dlaczego nie po prostu 255? Są dwa powody, dla których należy unikać powszechnej praktyki używania (255) do wszystkiego.
- Gdy złożony
SELECT
musi utworzyć tabelę tymczasową (dla podzapytania,UNION
,GROUP BY
itp.), Preferowanym wyborem jest użycie silnikaMEMORY
, który umieszcza dane w pamięci RAM. Ale w tym procesieVARCHARs
są przekształcane wCHAR
. To sprawia, żeVARCHAR(255) CHARACTER SET utf8mb4
zajmuje 1020 bajtów. Może to prowadzić do konieczności rozlania się na dysk, który jest wolniejszy. - W niektórych sytuacjach InnoDB przyjrzy się potencjalnemu rozmiarowi kolumn w tabeli i zdecyduje, że będzie zbyt duży, przerywając
CREATE TABLE
.
VARCHAR kontra TEKST
Wskazówki dotyczące użytkowania *TEXT
, CHAR
i VARCHAR
, a także kilka najlepszych praktyk:
- Nigdy nie używaj
TINYTEXT
. - Prawie nigdy nie używaj
CHAR
- ma ustaloną długość; każdy znak jest maksymalną długością ZNAKUCHARACTER SET
(np. 4 bajty / znak dla utf8mb4). - Z
CHAR
używajCHARACTER SET ascii
chyba że wiesz inaczej. -
VARCHAR(n)
obetnie n znaków ;TEXT
zostanie obcięty przy pewnej liczbie bajtów . (Ale czy chcesz obcinać?) -
*TEXT
może spowolnić złożoneSELECTs
powodu sposobu obsługiwania tabel tymczasowych.
INT jako AUTO_INCREMENT
Dla AUTO_INCREMENT
można użyć dowolnego rozmiaru INT
. UNSIGNED
jest zawsze właściwe.
Pamiętaj, że niektóre operacje „wypalają” identyfikatory AUTO_INCREMENT
. Może to prowadzić do nieoczekiwanej luki. Przykłady: INSERT IGNORE
i REPLACE
. Mogą przydzielenia identyfikatora przed zdając sobie sprawę, że nie będzie potrzebna. Jest to oczekiwane zachowanie i projekt w silniku InnoDB i nie powinno zniechęcać do ich używania.
Inne
Istnieje już osobny wpis dla „FLOAT, DOUBLE i DECIMAL” i „ENUM”. Pojedyncza strona na typach danych prawdopodobnie będzie nieporęczna - sugeruję, aby „Typy pól” (czy powinno się to nazywać „Typami danych”?) Były przeglądem, a następnie podzielić na następujące strony tematyczne:
- INTs
- PŁYWAK, PODWÓJNY i dziesiętny
- Ciągi znaków (znaki, tekst itp.)
- BINARY i BLOB
- DATETIME, TIMESTAMP i przyjaciele
- ENUM i SET
- Danych przestrzennych
- Typ JSON (MySQL 5.7.8+)
- Jak reprezentować pieniądze i inne popularne „typy”, które wymagają przekształcenia w istniejące typy danych
W stosownych przypadkach każda strona tematu powinna zawierać oprócz składni i przykładów:
- Uwagi na temat zmiany
- Rozmiar (bajty)
- Kontrast z silnikami innymi niż MySQL (niski priorytet)
- Uwagi dotyczące korzystania z typu danych w KLUCZU PODSTAWOWYM lub kluczu dodatkowym
- inne najlepsze praktyki
- inne problemy z wydajnością
(Zakładam, że ten „przykład” sam się rozproszy, gdy moje sugestie zostaną spełnione lub zawetowane).
Wprowadzenie (numeryczne)
MySQL oferuje wiele różnych typów liczbowych. Można je podzielić na
Grupa | Rodzaje |
---|---|
Typy całkowite | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Typy stałych punktów | DECIMAL , NUMERIC |
Typy zmiennoprzecinkowe | FLOAT , DOUBLE |
Typ wartości bitu | BIT |
Typy całkowite
Minimalna wartość bez znaku wynosi zawsze 0.
Rodzaj | Przechowywanie (Bajty) | Minimalna wartość (Podpisano) | Maksymalna wartość (Podpisano) | Maksymalna wartość (Bez podpisu) |
---|---|---|---|---|
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 |
Typy stałych punktów
Typy DECIMAL
i NUMERIC
w MySQL przechowują dokładne wartości danych liczbowych. Zaleca się stosowanie tych typów w celu zachowania dokładności, np. W przypadku pieniędzy.
Dziesiętny
Wartości te są przechowywane w formacie binarnym. W deklaracji kolumny należy podać dokładność i skalę
Precyzja reprezentuje liczbę cyfr znaczących, które są przechowywane dla wartości.
Skala reprezentuje liczbę cyfr zapisanych po przecinku
salary DECIMAL(5,2)
5 oznacza precision
a 2 oznacza scale
. W tym przykładzie zakres wartości, które można zapisać w tej kolumnie, wynosi od -999.99 to 999.99
Jeśli parametr skali zostanie pominięty, domyślnie ustawiony jest na 0
Ten typ danych może przechowywać do 65 cyfr.
Liczba bajtów pobranych przez DECIMAL(M,N)
wynosi około M/2
.
Typy zmiennoprzecinkowe
FLOAT
i DOUBLE
reprezentują przybliżone typy danych.
Rodzaj | Przechowywanie | Precyzja | Zasięg |
---|---|---|---|
PŁYWAK | 4 bajty | 23 znaczące bity / ~ 7 cyfr dziesiętnych | 10 ^ + / - 38 |
PODWÓJNIE | 8 bajtów | 53 znaczące bity / ~ 16 cyfr dziesiętnych | 10 ^ + / - 308 |
REAL
jest synonimem FLOAT
. DOUBLE PRECISION
jest synonimem DOUBLE
.
Chociaż MySQL pozwala także na kwalifikator (M, D), nie należy go używać. (M, D) oznacza, że wartości mogą być przechowywane z maksymalnie M cyfr ogółem, gdzie D może być po przecinku. Liczby zostaną zaokrąglone dwukrotnie lub obcięte; spowoduje to więcej kłopotów niż korzyści.
Ponieważ wartości zmiennoprzecinkowe są przybliżone i nie są przechowywane jako dokładne wartości, próby traktowania ich jako dokładne w porównaniu mogą prowadzić do problemów. Należy zauważyć w szczególności, że wartość FLOAT
rzadko jest równa wartości DOUBLE
.
Typ wartości bitu
Typ BIT
jest przydatny do przechowywania wartości pól bitowych. BIT(M)
pozwala na przechowywanie wartości do M-bitów, gdzie M jest w zakresie od 1 to 64
Można również określić wartości za pomocą notacji bit value
.
b'111' -> 7
b'10000000' -> 128
Czasami przydaje się użycie „shift” do skonstruowania wartości jednobitowej, na przykład (1 << 7)
dla 128.
Maksymalny łączny rozmiar wszystkich kolumn BIT w tabeli NDB
wynosi 4096.
CHAR (n)
CHAR(n)
jest łańcuchem o stałej długości n
znaków . Jeśli jest to CHARACTER SET utf8mb4
, oznacza to, że zajmuje dokładnie 4*n
bajtów , niezależnie od tego, jaki jest w nim tekst.
Większość przypadków użycia dla CHAR(n)
obejmuje łańcuchy zawierające angielskie znaki, dlatego powinien być CHARACTER SET ascii
. ( latin1
da równie dobre wyniki).
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATA, DATETIME, TIMESTAMP, YEAR i TIME
Typ danych DATE
zawiera datę, ale nie zawiera składnika czasu. Jego format to 'YYYY-MM-DD'
w zakresie od „1000-01-01” do „9999-12-31”.
Typ DATETIME
obejmuje czas w formacie „RRRR-MM-DD GG: MM: SS”. Ma zakres od „1000-01-01 00:00:00” do „9999-12-31 23:59:59”.
Typ TIMESTAMP
jest liczbą całkowitą zawierającą datę i godzinę z efektywnym zakresem od „1970-01-01 00:00:01” UTC do „2038-01-19 03:14:07” UTC.
Typ YEAR
oznacza rok i obejmuje zakres od 1901 do 2155.
Typ TIME
reprezentuje czas w formacie „GG: MM: SS” i obejmuje zakres od „-838: 59: 59” do „838: 59: 59”.
Wymagania dotyczące przechowywania:
|-----------|--------------------|----------------------------------------|
| 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 |
|-----------|--------------------|----------------------------------------|
Sekwencje ułamkowe (od wersji 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Zobacz strony podręcznika MySQL Typy DATA, DATETIME i TIMESTAMP , Wymagania dotyczące przechowywania danych i Ułamkowe sekundy w wartościach czasowych .