Wprowadzenie
Jedną z podstawowych cech relacyjnych baz danych jest możliwość definiowania schematów lub struktur tabel, które dokładnie określają format danych, które będą zawierać. Odbywa się to poprzez przepisanie kolumn, które zawierają te struktury, wraz z ich typem danych i wszelkie ograniczenia.
Typy danych określają ogólny wzorzec dla danych, które akceptują i przechowują. Aby wartości mogły zostać zaakceptowane przez MySQL, muszą być zgodne z określonymi w nich wymaganiami. Chociaż możliwe jest zdefiniowanie niestandardowych wymagań, typy danych zapewniają podstawowe bloki konstrukcyjne, które umożliwiają MySQL weryfikowanie danych wejściowych i pracę z danymi przy użyciu odpowiednich operacji.
MySQL obejmuje szeroki zakres typów danych, które są używane do etykietowania i sprawdzania, czy wartości są zgodne z odpowiednimi typami. W tym przewodniku omówimy najpopularniejsze typy danych dostępne w MySQL, różne używane przez nie formaty wejściowe i wyjściowe oraz jak skonfigurować różne pola, aby spełnić potrzeby aplikacji.
Jakie są typy danych w MySQL?
Zanim przejdziemy do szczegółów, przyjrzyjmy się ogólnie, jakie typy danych zapewnia MySQL.
MySQL obsługuje rozsądny zakres typów danych odpowiednich dla różnych typów danych prostych i złożonych. Należą do nich:
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
NUMERIC
FLOAT
DOUBLE
BIT
DATE
DATETIME
TIMESTAMP
TIME
YEAR
CHAR
VARCHAR
BINARY
VARBINARY
BLOB
TEXT
ENUM
SET
GEOMETRY
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
POLYGON
GEOMETRYCOLLECTION
JSON
W tym przewodniku omówimy najczęstsze z nich bardziej szczegółowo.
Pierwsze kroki z typami danych MySQL
Rozpoczynając pracę z typami, należy pamiętać, że same typy nie zawsze są kompletnym rozwiązaniem do sprawdzania poprawności danych, ale komponentem. Inne narzędzia bazodanowe, takie jak ograniczenia, również odgrywają rolę w definiowaniu poprawności. Mimo to typy danych są często pierwszą linią obrony przed nieprawidłowymi danymi.
W wielu przypadkach ogólne typy dostarczane przez MySQL są odpowiednie dla rodzajów danych, które będziesz przechowywać. Na przykład, chociaż możesz przechowywać współrzędne punktu geometrycznego w dwóch różnych kolumnach liczbowych, podany point
type jest przeznaczony do przechowywania i weryfikowania dokładnie tego typu informacji. Wybierając typy, sprawdź, czy używasz najbardziej konkretnego typu odpowiedniego dla Twojego przypadku użycia.
Liczby i wartości numeryczne
MySQL zawiera szereg liczbowych typów danych odpowiednich dla różnych scenariuszy. Odpowiedni typ zależy od dokładnego charakteru wartości, które planujesz przechowywać, a także od Twoich wymagań dotyczących precyzji.
Liczby całkowite
liczba całkowita typ danych to kategoria typów używana do przechowywania liczb bez żadnych ułamków zwykłych ani dziesiętnych. Mogą to być wartości dodatnie lub ujemne, a różne typy liczb całkowitych mogą przechowywać różne zakresy liczb. Typy liczb całkowitych z mniejszymi zakresami dopuszczalnych wartości zajmują mniej miejsca niż te z szerszymi zakresami.
Podstawowa lista typów liczb całkowitych obejmuje:
Typ całkowity | Długość | Odpowiednie podpisany zakres | Odpowiedni zakres bez znaku |
---|---|---|---|
TINYINT | 1 bajt | -128 do 127 | 0 do 255 |
SMALLINT | 2 bajty | -32768 do 32767 | 0 do 65535 |
MEDIUMINT | 3 bajty | -8388608 do 8388607 | 0 do 16777215 |
INT | 4 bajty | -2147483648 do 2147483647 | 0 do 4294967295 |
BIGINT | 8 bajtów | -2^63 do -2^63-1 | 0 do 2^64-1 |
Powyższe typy są ograniczone ich obowiązującym zakresem. Każda wartość spoza zakresu spowoduje błąd.
Oprócz typów wymienionych powyżej, MySQL rozpoznaje również alias o nazwie SERIAL
. Oznaczenie kolumny jako SERIAL
da mu następujące właściwości:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Jest to używane jako skrót dla typowych właściwości kolumny klucza podstawowego. Kolumna automatycznie przypisze nową unikalną wartość za każdym razem, gdy dodany zostanie rekord.
Stały punkt
Typy punktów stałych służą do kontrolowania precyzji lub specyficzność możliwa dla liczby z ułamkami dziesiętnymi. W MySQL można to kontrolować, manipulując dwoma czynnikami:precyzją i skalą.
Precyzja to maksymalna łączna liczba cyfr, jaką może mieć liczba. Natomiast skaluj to liczba cyfr po prawej stronie przecinka dziesiętnego. Manipulując tymi liczbami, możesz kontrolować, jak duże mogą być składniki ułamkowe i nieułamkowe liczby.
Te dwa argumenty są używane do kontrolowania dowolnej precyzji za pomocą numeric
lub decimal
typy danych (te dwa typy są synonimami w MySQL). numeric
typ przyjmuje od zera do dwóch argumentów.
Bez argumentów kolumna jest zdefiniowana jako mająca precyzję 10 i skalę 0. Oznacza to, że kolumna może zawierać do 10 cyfr, ale żadna z nich nie może znajdować się po przecinku:
NUMERIC
Podanie pojedynczego argumentu jest interpretowane jako dokładność kolumny ze skalą ustawioną na 0. To skutecznie pozwala określić maksymalną liczbę cyfr w liczbie całkowitej (bez składników ułamkowych lub dziesiętnych). Na przykład, jeśli potrzebujesz 5-cyfrowej liczby całkowitej, możesz określić:
NUMERIC(5)
Określ dokładność, po której następuje skala podczas konfigurowania kolumny przy użyciu obu kontrolek. MySQL zaokrągli składnik dziesiętny dowolnego wejścia do prawidłowej liczby cyfr przy użyciu liczby skali. MySQL użyje precyzji i skali, aby określić, ile cyfr jest dozwolone po lewej stronie przecinka dziesiętnego. Jeśli wpis przekroczy dozwoloną liczbę cyfr, MySQL wygeneruje błąd.
Na przykład możemy określić kolumnę o całkowitej precyzji 5 i skali 2:
NUMERIC(5, 2)
Ta kolumna miałaby następujące zachowanie:
Wartość wejściowa | Wartość zaokrąglona | Zaakceptowano (dokładnie pasuje)? |
---|---|---|
400.28080 | 400,28 | Tak |
8.332799 | 8,33 | Tak |
11799.799 | 11799,80 | Nie |
11799 | 11799 | Nie |
2802.27 | 2802.27 | Nie |
zmienny punkt
Liczby zmiennoprzecinkowe to kolejny sposób wyrażania liczb dziesiętnych, ale bez dokładnej, spójnej precyzji. Zamiast tego typy zmiennoprzecinkowe mają jedynie koncepcję maksymalnej precyzji, która często jest związana z architekturą i platformą sprzętu.
Na przykład, aby ograniczyć kolumnę zmiennoprzecinkową do 8 cyfr precyzji, możesz użyć FLOAT
type, który przechowuje wyniki przy użyciu 4 bajtów z dokładnością od 0 do 23 cyfr:
FLOAT(8)
Podobnie DOUBLE
type używa 8 bajtów do przechowywania danych i może używać precyzji od 24 do 53 cyfr.
Ze względu na te wybory projektowe liczby zmiennoprzecinkowe mogą wydajnie pracować z liczbami z dużą liczbą miejsc po przecinku, ale nie zawsze dokładnie. Wewnętrzna reprezentacja liczb może powodować niewielkie różnice między wejściem a wyjściem. Może to spowodować nieoczekiwane zachowanie podczas porównywania wartości, wykonywania obliczeń zmiennoprzecinkowych lub wykonywania operacji wymagających dokładnych wartości.
zmiennoprzecinkowa a numeryczna
Obie liczby zmiennoprzecinkowe dostarczane przez typy takie jak FLOAT
i DOUBLE
i numery punktów stałych dostarczone przez NUMERIC
lub DECIMAL
typy mogą służyć do przechowywania wartości dziesiętnych. Skąd wiesz, którego użyć?
Ogólna zasada jest taka, że jeśli potrzebujesz dokładności w swoich obliczeniach, NUMERIC
typ jest zawsze lepszym wyborem. NUMERIC
type przechowuje wartości dokładnie tak, jak są one dostarczane, co oznacza, że wyniki są całkowicie przewidywalne podczas pobierania lub obliczania wartości. NUMERIC
typ jest nazywany arbitralną precyzją, ponieważ określasz ilość precyzji, jakiej wymaga typ, i przechowuje on dokładnie taką liczbę cyfr w polu.
Natomiast typy takie jak FLOAT
i DOUBLE
są typami o zmiennej precyzji. Utrzymywana przez nie dokładność zależy od wartości wejściowej. Kiedy osiągną koniec dozwolonego poziomu dokładności, mogą zaokrąglić pozostałe cyfry, prowadząc do różnic między przesłanymi a pobranymi wartościami.
Kiedy więc używałbyś typów o zmiennej precyzji? Typy o zmiennej precyzji, takie jak FLOAT
i DOUBLE
są dobrze przystosowane do scenariuszy, w których dokładne wartości nie są konieczne (na przykład, jeśli i tak zostaną zaokrąglone), a prędkość jest bardzo cenna. Zmienna precyzja zazwyczaj zapewnia większą wydajność niż NUMERIC
typ.
Typy stringów
Typy znaków i typy łańcuchów MySQL można podzielić na dwie kategorie:stała długość i zmienna długość . Wybór między tymi dwoma wpływa na to, jak MySQL przydziela miejsce dla każdej wartości i jak sprawdza poprawność danych wejściowych.
Najprostszym typem danych opartym na znakach w MySQL jest char
rodzaj. Bez argumentów char
type akceptuje pojedynczy znak jako dane wejściowe:
CHAR
Gdy w deklaracji podano dodatnią liczbę całkowitą, char
kolumna będzie przechowywać ciąg znaków o stałej długości, równy określonej liczbie znaków:
CHAR(10)
Jeśli ciąg zawiera mniej znaków, spacje zostaną dodane w celu uzupełnienia długości:
Wejście | Liczba znaków wejściowych | Przechowywana wartość | Liczba zapisanych znaków |
---|---|---|---|
'drzewo' | 4 | 'drzewo ” | 10 |
Jeśli zostanie podany łańcuch z większą niż dozwoloną liczbą znaków, MySQL zgłosi błąd. Jako wyjątek od tej reguły, jeśli przepełnione znaki są spacjami, MySQL po prostu skróci nadmiarowe spacje, aby zmieściły się w polu.
Alternatywą dla pól znakowych o stałej długości są pola o zmiennej długości. W tym celu MySQL udostępnia varchar
rodzaj. varchar
type przechowuje znaki bez ustalonego rozmiaru. W przeciwieństwie do char
, varchar
nie można użyć bez określenia maksymalnej liczby znaków do przechowywania.
Definiując varchar
z dodatnią liczbą całkowitą, możesz ustawić maksymalną długość ciągu:
VARCHAR(10)
Różni się to od używania char
wpisz z liczbą całkowitą w tym varchar
nie dopełni wartości, jeśli dane wejściowe nie spełniają maksymalnej długości pola:
Wejście | Liczba znaków wejściowych | Przechowywana wartość | Liczba zapisanych znaków |
---|---|---|---|
'drzewo' | 4 | 'drzewo' | 4 |
Jeśli ciąg jest większy niż maksymalna długość, MySQL zgłosi błąd. To samo zachowanie obcinania, które jest obecne w char
pola występują tutaj:jeśli przepełnione znaki są spacjami, zostaną one obcięte, aby zmieściły się w maksymalnej długości znaku.
MySQL obsługuje również binary
i varbinary
typy danych. Działają one w podobny sposób do char
i varchar
typy, ale przechowują ciągi binarne, a nie ciągi znaków. Ma to wpływ na sposób ich przechowywania i obsługi (w przypadku porównań, sortowania itp.).
Dla binary
i varbinary
typy, liczba całkowita podana podczas definiowania typu kolumny reprezentuje liczbę bajtów zamiast liczby znaków.
Dwa inne typy danych, które MySQL zapewnia dla ciągów i przechowywania znaków to blob
i text
. Te typy działają podobnie do varchar
i varbinary
odpowiednio typów i są przeznaczone do przechowywania dużych obiektów. Działają one w większości tak samo jak ich odpowiedniki, ale mają kilka różnic, takich jak brak możliwości uzyskania wartości domyślnych i wymaganie długości prefiksu podczas tworzenia indeksu.
Boolean
MySQL w rzeczywistości nie ma natywnego typu logicznego do reprezentowania wartości prawdziwych i fałszywych.
MySQL rozpoznaje typy BOOL
lub BOOLEAN
w celu zapewnienia kompatybilności z innymi systemami baz danych. Jego wewnętrzna implementacja używa jednak TINYINT(1)
kolumna do przechowywania wartości i interpretowania ich jako prawda lub fałsz w oparciu o zestaw reguł.
Podczas interpretowania wartości liczbowych w kontekście logicznym, wartość 0
jest uważany za fałszywy. Wszystkie wartości niezerowe są uważane za prawdziwe.
MySQL rozpoznaje literały logiczne TRUE
i FALSE
i konwertuje TRUE
na 1 i FALSE
do 0 podczas ich przechowywania.
Daty i czas
MySQL obsługuje reprezentację dat, godzin i ich kombinacji.
Daty
date
typ może przechowywać datę bez powiązanej wartości czasu:
DATE
Podczas przetwarzania danych wejściowych dla date
kolumn, MySQL może interpretować różne formaty, aby określić poprawną datę do przechowywania. Jednak części składowe muszą zawsze pojawiać się w tej samej kolejności:rok, miesiąc, a następnie dzień. STR_TO_DATE()
dostępna jest funkcja ułatwiająca konwersję innych formatów daty na format, który MySQL będzie poprawnie interpretował.
Podczas wyświetlania dat MySQL używa YYYY-MM-DD
format. Możesz użyć DATE_FORMAT()
funkcja formatowania wyjścia w innych formatach.
date
type może przechowywać wartości z zakresu 1000-01-01
do 9999-12-31
.
Czas
time
typ danych może przechowywać określoną porę dnia bez powiązanej strefy czasowej lub daty.
Podczas przetwarzania danych wejściowych dla time
kolumn, MySQL może interpretować wiele formatów, aby określić poprawny czas przechowywania. Gdy dane wejściowe mają dwukropki, jest to ogólnie interpretowane jako hh:mm:ss
. Każda skrócona wartość (używająca tylko jednej kolumny) będzie interpretowana jako użycie hh:mm
. Gdy dane wejściowe nie mają dwukropki, czas jest przetwarzany, aby najpierw wypełnić najmniejszą wartość. Na przykład 1045
jest brane jako 10 minut i 45 sekund.
MySQL obsługuje również ułamki sekund, jeśli podano kropkę dziesiętną. Przechowuje do 6 cyfr precyzji po przecinku. Wartości w time
kolumny mogą mieć zakres od -838:59:59.000000
do 838:59:59.000000
.
Podczas wyświetlania wartości czasu MySQL używa hh:mm:ss
format. Podobnie jak w przypadku dat, dostępna jest funkcja o nazwie TIME_FORMAT()
aby wyświetlić wartości czasu w innych formatach.
sygnatury czasowe i datagodzina
MySQL może reprezentować znaczniki czasu, kombinację daty i godziny używane do reprezentowania określonego momentu w czasie, w dwóch różnych odmianach:przy użyciu timestamp
typ i datetime
typ.
datetime
typ może reprezentować wartości od 1000-01-01 00:00:00
do 9999-12-31 23:59:59
. Może również zawierać ułamki sekund do sześciu cyfr, podobnie jak time
typ.
timestamp
typ może reprezentować wartości od 1970-01-01 00:00:01
UTC do 2038-01-19 03:14:07
UTC. Poradzi sobie również z ułamkami sekund. Podczas przechowywania timestamp
wartości, wszystkie wartości są konwertowane z podanej strefy czasowej na UTC w celu przechowywania i konwertowane z powrotem na lokalną strefę czasową podczas pobierania. datetime
typ tego nie robi.
Od MySQL 8.0.19 i nowszych możesz uwzględnić przesunięcie strefy czasowej podczas przechowywania timestamp
aby jawnie ustawić strefę czasową dla przechowywanej wartości. Robisz to, dołączając wartość po składniku czasu, bez miejsca na wskazanie przesunięcia. Zakres akceptowanych wartości wynosi od -14:00
do +14:00
, który reprezentuje przesunięcie przechowywanej wartości względem czasu UTC.
Decydując o tym, czy przechowywać wartości daty i czasu za pomocą datetime
lub timezone
typów, często pomocne jest oddzielenie ich według tego, do czego są najlepsze.
Pomyśl o datetime
wartości jako konkretną datę i godzinę, w odniesieniu do kalendarza i zegara, gdziekolwiek są pobierane. Jeśli ktoś kładzie się spać o 23:00 w nocy, datetime
wartość może reprezentować tę wartość, niezależnie od strefy czasowej, w której aktualnie znajduje się dana osoba.
Z drugiej strony timezone
wartości najlepiej reprezentują określony moment w czasie, który jest jednoznaczny we wszystkich strefach czasowych. Aby wysłać zaproszenie do rozmowy wideo, timezone
wartość byłaby w stanie zapewnić, że spotkanie odbędzie się w tym samym czasie dla wszystkich, niezależnie od strefy czasowej, w której znajduje się uczestnik.
Inne przydatne typy
Oprócz typów, które omówiliśmy powyżej, istnieją dodatkowe typy, które są przydatne w określonych scenariuszach. Omówimy je pokrótce, aby pokazać, jak z nich korzystać i kiedy mogą być przydatne.
Typy wyliczone i ustawione
Dwa powiązane typy, które pozwalają użytkownikom dyktować prawidłowe wartości dla kolumny, to enum
i set
typy.
enum
type to typ ciągu, który umożliwia użytkownikowi zdefiniowanie kolekcji poprawnych wartości podczas tworzenia kolumny. Każda wartość, która pasuje do jednej ze zdefiniowanych wartości, jest akceptowana, a wszystkie inne wartości są odrzucane. Działa to podobnie do menu rozwijanego, ponieważ wyboru można dokonać z określonego zestawu opcji. Na przykład enum
o nazwie season
można utworzyć z wartościami winter
, spring
, summer
i autumn
.
Tworzenie enum
kolumna, określ typ jako enum
, podając możliwe wartości jako ciągi, oddzielone przecinkami, wewnątrz zestawu nawiasów, w ten sposób:
season ENUM('winter', 'spring', 'summer', 'autumn')
Podobnym typem typu zdefiniowanego przez użytkownika jest set
rodzaj. Podobnie jak enum
typ, set
typy umożliwiają użytkownikom określanie prawidłowych wartości jako ciągów po definicji. Różnica między tymi dwoma typami polega na tym, że w set
, dla każdego rekordu można zapisać więcej niż jedną wartość.
Na przykład, jeśli potrzebujesz kolumny reprezentującej dni tygodnia, w których wolontariusze są dostępni do pracy, możesz mieć set
kolumna w ten sposób:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Podczas wprowadzania wartości dla availability
kolumny, którą właśnie utworzyliśmy, podajesz pojedynczy ciąg znaków z przecinkami oddzielającymi wszystkie dni, w których wolontariusz jest dostępny. Na przykład:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Dla set
typów w MySQL, zduplikowane wartości na wejściu są zawsze usuwane, a po pobraniu wartości są zgodne z kolejnością używaną w set
definicja niezależnie od kolejności przy wprowadzaniu w kolumnie.
JSON
MySQL obsługuje kolumny w JSON przy użyciu json
rodzaj. Dane przechowywane jako json
jest przechowywany w postaci binarnej w celu szybszego wykonania i przetwarzania, dzięki czemu serwer nie musi interpretować ciągu, aby operować na JSON
wartości.
JSON
Aby operować na JSON
kolumn, MySQL zapewnia szereg funkcji do pracy z wartościami w dokumencie.
Wniosek
W tym artykule omówiliśmy wiele najpopularniejszych typów danych, które są przydatne podczas pracy z bazami danych MySQL. Istnieją dodatkowe typy nieomówione w tym przewodniku, o których warto wiedzieć, ale stanowią one dobry punkt wyjścia dla większości przypadków użycia.
Ważne jest, aby właściwie używać systemu typów, aby można było kontrolować prawidłowe wartości i operować na danych zgodnie z oczekiwaniami. Istnieją pułapki, na które możesz natknąć się, jeśli wybierzesz typ nieodpowiedni dla Twoich danych, więc w większości przypadków warto zastanowić się, zanim zdecydujesz się na typ danych.
Jeśli używasz Prisma Client do pracy z bazami danych MySQL, możesz znaleźć mapowanie między niektórymi popularnymi typami MySQL i Prisma w dokumentacji łączników danych MySQL firmy Prisma.