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 silnika MEMORY , który umieszcza dane w pamięci RAM. Ale w tym procesie VARCHARs są przekształcane w CHAR . To sprawia, że VARCHAR(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ą ZNAKU CHARACTER SET (np. 4 bajty / znak dla utf8mb4).
  • Z CHAR używaj CHARACTER 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żone SELECTs 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 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow