Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wprowadzenie do typów danych MySQL


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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaplanować procedurę składowaną w MySQL

  2. Python SQL — jak korzystać z baz danych SQLite, MySQL i PostgreSQL w Pythonie

  3. BIN() — pobierz wartość binarną liczby w MySQL

  4. Jak działa MySQL CASE?

  5. MySQL:Kod błędu:1118 Zbyt duży rozmiar wiersza (> 8126). Zmiana niektórych kolumn na TEKST lub BLOB