Въведение
Една от основните характеристики на релационните бази данни като цяло е способността да се дефинират схеми или структури на таблици, които точно определят формата на данните, които ще съдържат. Това става чрез предписване на колоните, които тези структури съдържат заедно с техния тип данни и всякакви ограничения.
Типовете данни определят общ модел за данните, които приемат и съхраняват. Стойностите трябва да се придържат към изискванията, които те очертават, за да бъдат приети от MySQL. Въпреки че е възможно да се дефинират персонализирани изисквания, типовете данни предоставят основните градивни елементи, които позволяват на MySQL да валидира въведените данни и да работи с данните, използвайки подходящи операции.
MySQL включва широк спектър от типове данни, които се използват за етикетиране и валидиране, че стойностите съответстват на подходящи типове. В това ръководство ще обсъдим най-често срещаните типове данни, налични в MySQL, различните входни и изходни формати, които използват, и как да конфигурирате различни полета, за да отговарят на нуждите на вашите приложения.
Какви са типовете данни в MySQL?
Преди да влезем в подробности, нека разгледаме по-широко какви типове данни предоставя MySQL.
MySQL поддържа разумен набор от типове данни, подходящи за различни типове прости и сложни данни. Те включват:
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
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Ще разгледаме най-често срещаните от тях по-задълбочено в това ръководство.
Първи стъпки с типове данни на MySQL
Когато започнете с типове, важно е да запомните, че типовете сами по себе си не винаги са цялостно решение за валидиране на данни, а са компонент. Други инструменти за база данни, като ограничения, също играят роля при дефинирането на коректността. И все пак типовете данни често са първата линия на защита срещу невалидни данни.
В много случаи общите типове, предоставени от MySQL, са подходящи за видовете данни, които ще съхранявате. Например, докато можете да съхранявате координатите на геометрична точка в две различни колони с числа, предоставената point
Типът е предназначен за съхраняване и валидиране на точно този тип информация. Когато избирате типове, проверете дали използвате най-специфичния тип, приложим за вашия случай на употреба.
Числа и числови стойности
MySQL включва набор от числови типове данни, подходящи за различни сценарии. Подходящият тип зависи от точното естество на стойностите, които планирате да съхранявате, както и от вашите изисквания за прецизност.
Цели числа
Цялото число Типът данни е категория типове, използвани за съхраняване на числа без дроби или десетични знаци. Те могат да бъдат както положителни, така и отрицателни стойности, а различните видове цели числа могат да съхраняват различни диапазони от числа. Целочислените типове с по-малки диапазони от приемливи стойности заемат по-малко място от тези с по-широк диапазон.
Основният списък от типове цели числа включва следното:
Цялочислен тип | Дължина | Приложим подписан диапазон | Приложим неподписан диапазон |
---|---|---|---|
TINYINT | 1 байт | -128 до 127 | 0 до 255 |
SMALLINT | 2 байта | -32768 до 32767 | 0 до 65535 |
MEDIUMINT | 3 байта | -8388608 до 8388607 | 0 до 16777215 |
INT | 4 байта | -2147483648 до 2147483647 | 0 до 4294967295 |
BIGINT | 8 байта | -2^63 до -2^63-1 | 0 до 2^64-1 |
Горните типове са ограничени от техния валиден обхват. Всяка стойност извън диапазона ще доведе до грешка.
В допълнение към типовете, споменати по-горе, MySQL разпознава и псевдоним, наречен SERIAL
. Маркиране на колона като SERIAL
ще му даде следните свойства:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Това се използва като стенография за общи свойства на колона с първичен ключ. Колоната автоматично ще присвоява нова уникална стойност всеки път, когато се добави запис.
Фиксирана точка
Типовете фиксирани точки се използват за контролиране на количеството прецизност или възможна специфичност за число с десетични знаци. В MySQL това може да се контролира чрез манипулиране на два фактора:прецизност и мащаб.
Прецизност е максималното количество общи цифри, които може да има едно число. За разлика от това, мащаб е броят на цифрите вдясно от десетичната запетая. Като манипулирате тези числа, можете да контролирате колко големи могат да бъдат дробните и недробните компоненти на число.
Тези два аргумента се използват за контролиране на произволна прецизност с помощта на numeric
или decimal
типове данни (тези два типа са синоними в MySQL). numeric
type приема нула до два аргумента.
Без аргументи колоната се дефинира като с точност 10 и мащаб 0. Това означава, че колоната може да съдържа до 10 цифри, но нито една от тях не може да бъде след десетичната запетая:
NUMERIC
Когато е предоставен единичен аргумент, той се интерпретира като прецизност на колоната с мащаб, зададен на 0. Това ефективно ви позволява да зададете максималния брой цифри в число, подобно на цяло число (без дробни или десетични компоненти). Например, ако имате нужда от 5-цифрено цяло число, можете да посочите:
NUMERIC(5)
Посочете прецизност, последвана от мащаб, когато конфигурирате колона с помощта на двете контроли. MySQL ще закръгли десетичния компонент на всеки вход до правилния брой цифри, използвайки номера на мащаба. MySQL ще използва точността и мащаба, за да определи колко цифри са разрешени от лявата страна на десетичната запетая. Ако даден запис надвишава позволения брой цифри, MySQL ще произведе грешка.
Например, можем да посочим колона с обща точност 5 и мащаб от 2:
NUMERIC(5, 2)
Тази колона ще има следното поведение:
Въведена стойност | Закръглена стойност | Приема се (съответства на точност)? |
---|---|---|
400.28080 | 400,28 | Да |
8.332799 | 8,33 | Да |
11799,799 | 11799,80 | Не |
11799 | 11799 | Не |
2802.27 | 2802.27 | Не |
Плававаща точка
Числата с плаваща запетая са друг начин за изразяване на десетични числа, но без точна, последователна точност. Вместо това типовете с плаваща запетая имат само концепция за максимална прецизност, която често е свързана с архитектурата и платформата на хардуера.
Например, за да ограничите колона с плаваща запетая до 8 цифри с точност, можете да използвате FLOAT
тип, който съхранява резултати с помощта на 4 байта с от 0 до 23 цифри на точност:
FLOAT(8)
По същия начин, DOUBLE
Типът използва 8 байта за съхранение на данни и може да използва точност от 24 до 53 цифри.
Поради този избор на дизайн, числата с плаваща запетая могат да работят ефективно с числа с голям брой десетични знаци, но не винаги точно. Вътрешното представяне на числата може да причини леки разлики между входа и изхода. Това може да причини неочаквано поведение при сравняване на стойности, извършване на математика с плаваща запетая или извършване на операции, които изискват точни стойности.
Плававаща запетая срещу числово
И двете числа с плаваща запетая, предоставени от типове като FLOAT
и DOUBLE
и номера на фиксирани точки, предоставени от NUMERIC
или DECIMAL
типове могат да се използват за съхраняване на десетични стойности. Как да разберете кой да използвате?
Общото правило е, че ако имате нужда от точност във вашите изчисления, NUMERIC
типът винаги е по-добрият избор. NUMERIC
type ще съхранява стойности точно както са предоставени, което означава, че резултатите са напълно предвидими при извличане или изчисляване на стойности. NUMERIC
Типът се нарича произволна прецизност, защото вие посочвате количеството точност, което типът изисква и той ще съхранява точно това количество цифри в полето.
За разлика от тях, типове като FLOAT
и DOUBLE
са типове с променлива прецизност. Размерът на прецизността, която поддържат, зависи от входната стойност. Когато достигнат края на разрешеното си ниво на точност, те могат да закръглят останалите цифри, което води до разлики между изпратените и извлечените стойности.
И така, кога бихте използвали типове с променлива точност? Типове с променлива точност като FLOAT
и DOUBLE
са много подходящи за сценарии, при които точните стойности не са необходими (например, ако те все пак ще бъдат закръглени) и когато скоростта е много ценна. Прецизността на променливата обикновено предлага предимства на производителността спрямо NUMERIC
тип.
Типове низове
Типовете знаци и низовете на MySQL могат да бъдат поставени в две категории:фиксирана дължина и променлива дължина . Изборът между тези две влияе върху това как MySQL разпределя пространство за всяка стойност и как проверява входа.
Най-простият базиран на знаци тип данни в MySQL е char
Тип. Без аргументи, char
type приема един знак като вход:
CHAR
Когато в декларацията е предоставено положително цяло число, char
колоната ще съхранява символен низ с фиксирана дължина, равен на броя на посочените знаци:
CHAR(10)
Ако низът е снабден с по-малко знаци, ще бъдат добавени празни интервали за допълване на дължината:
Въвеждане | # входни знаци | Запазена стойност | # съхранени знаци |
---|---|---|---|
'дърво' | 4 | 'дърво ' | 10 |
Ако е даден низ с по-голям от позволения брой знаци, MySQL ще изведе грешка. Като изключение от това правило, ако препълващите знаци са всички интервали, MySQL просто ще съкрати излишните интервали, за да пасне на полето.
Алтернативата на символните полета с фиксирана дължина са полетата с променлива дължина. За това MySQL предоставя varchar
Тип. varchar
type съхранява знаци без фиксиран размер. За разлика от char
, varchar
не може да се използва без уточняване на максималния брой знаци за съхранение.
Чрез дефиниране на varchar
с положително цяло число можете да зададете максимална дължина на низа:
VARCHAR(10)
Това се различава от използването на char
въведете с цяло число в този varchar
няма да добави стойността, ако входът не отговаря на максималната дължина на полето:
Въвеждане | # входни знаци | Запазена стойност | # съхранени знаци |
---|---|---|---|
'дърво' | 4 | 'дърво' | 4 |
Ако низът е по-голям от максималната дължина, MySQL ще изведе грешка. Същото поведение на съкращаване, което присъства в char
полетата се появяват тук:ако препълващите знаци са интервали, те ще бъдат съкратени, за да се поберат в максималната дължина на символа.
MySQL също така поддържа binary
и varbinary
типове данни. Те работят по подобен начин на char
и varchar
типове, но съхраняват двоични низове, а не символни низове. Това има отражение върху начина, по който те се съхраняват и оперират (за неща като сравнения, сортиране и т.н.).
За binary
и varbinary
типове, цялото число, дадено при дефиниране на типа колона, представлява броя на байтовете вместо броя на знаците.
Два други типа данни, които MySQL предоставя за низове и съхранение на знаци, са blob
и text
. Тези типове работят подобно на varchar
и varbinary
типове съответно и са предназначени за съхранение на големи обекти. Те работят предимно по същия начин като техните колеги, но имат няколко разлики, като например, че не могат да имат стойности по подразбиране и изискват дължина на префикса при създаване на индекс.
Булеви значения
MySQL всъщност няма роден булев тип за представяне на истинни и фалшиви стойности.
MySQL разпознава типовете BOOL
или BOOLEAN
в опит за съвместимост с други системи за бази данни. Неговата вътрешна реализация обаче използва TINYINT(1)
колона за съхраняване на стойностите и ги интерпретира като вярно или невярно въз основа на набор от правила.
Когато интерпретирате числови стойности в булев контекст, стойността на 0
се счита за невярно. Всички различни от нула стойности се считат за верни.
MySQL разпознава булевите литерали TRUE
и FALSE
и преобразува TRUE
до 1 и FALSE
до 0, когато ги съхранявате.
Дати и час
MySQL има поддръжка за представяне на дати, часове и комбинации от двете.
Дати
date
тип може да съхранява дата без свързана стойност за време:
DATE
При обработка на вход за date
колони, MySQL може да интерпретира различни формати, за да определи правилната дата за съхранение. Компонентните части обаче трябва винаги да идват в една и съща последователност:година, месец и след това ден. STR_TO_DATE()
функцията е налична, за да помогне за преобразуването на други формати за дата във формат, който MySQL ще интерпретира правилно.
Когато показва дати, MySQL използва YYYY-MM-DD
формат. Можете да използвате DATE_FORMAT()
функция за форматиране на изхода в други формати.
date
type може да съхранява стойности, вариращи от 1000-01-01
до 9999-12-31
.
Време
time
типът данни може да съхранява определено време от деня без свързана часова зона или дата.
При обработка на вход за time
колони, MySQL може да интерпретира множество формати, за да определи правилното време за съхранение. Когато въвеждането има двоеточия, то обикновено се интерпретира като hh:mm:ss
. Всяка съкратена стойност (използвайки само една колона) ще се интерпретира като използване на hh:mm
. Когато въвеждането не имат двоеточия, времето се обработва, за да се попълни първо най-малката стойност. Например, 1045
се приема за 10 минути и 45 секунди.
MySQL също така поддържа дробни секунди, ако е дадена десетична запетая. Той съхранява до 6 цифри с точност след десетичната запетая. Стойности в time
колоните могат да варират от -838:59:59.000000
до 838:59:59.000000
.
Когато показва стойности за време, MySQL използва hh:mm:ss
формат. Както при датите, е предоставена функция, наречена TIME_FORMAT()
за показване на стойности за време с помощта на други формати.
Чети за време и дата и час
MySQL може да представя времеви печати, комбинация от дата и час, използвани за представяне на конкретен момент във времето, в два различни варианта:с помощта на timestamp
тип и datetime
тип.
datetime
типът може да представлява стойности от 1000-01-01 00:00:00
до 9999-12-31 23:59:59
. Може също да включва частични секунди от до шест цифри, подобни на time
тип.
timestamp
типът може да представлява стойности от 1970-01-01 00:00:01
UTC до 2038-01-19 03:14:07
UTC. Може да обработва и части от секунди. При съхраняване на timestamp
стойности, всички стойности се преобразуват от дадена часова зона в UTC за съхранение и се преобразуват обратно в местната часова зона при извличане. datetime
type не прави това.
От MySQL 8.0.19 нататък можете да включите изместване на часовата зона, когато съхранявате timestamp
за да зададете изрично часовата зона за съхранената стойност. Можете да направите това, като включите стойност след компонента за време, без пространство за указване на отместването. Диапазонът на приетите стойности е от -14:00
до +14:00
, което представлява отместването на съхранената стойност от UTC.
Когато решавате дали да съхранявате стойности за дата и час с помощта на datetime
или timezone
типове, често е полезно да ги разделите според това за какво са най-подходящи.
Помислете за datetime
стойности като конкретна дата и час, във връзка с календара и часовника, където и да е извлечен. Ако човек си ляга в 23:00 вечерта, datetime
стойността може да представлява тази стойност, независимо в коя часова зона се намира лицето в момента.
От друга страна, timezone
стойностите са най-добри за представяне на конкретен момент от времето, който е недвусмислен за различните часови зони. За да изпратите покана за видеообаждане, timezone
value ще може да се увери, че срещата се провежда по едно и също време за всички, независимо в коя часова зона се намира участникът.
Други полезни типове
Наред с типовете, които разгледахме с известна дълбочина по-горе, има допълнителни типове, които са полезни в конкретни сценарии. Ще ги разгледаме накратко, за да ви дадем представа как да ги използвате и кога може да са полезни.
Преброени и зададени типове
Два свързани типа, които позволяват на потребителите да диктуват валидните стойности за колона, са enum
и set
видове.
enum
type е тип низ, който позволява на потребителя да дефинира колекция от валидни стойности, когато колоната е създадена. Всяка стойност, която съответства на една от дефинираните стойности, се приема, а всички други стойности се отхвърлят. Това функционира подобно на падащото меню, тъй като може да се направи избор от определен набор от опции. Например, enum
наречен season
може да се създаде със стойностите winter
, spring
, summer
и autumn
.
За да създадете enum
колона, посочете типа като enum
, давайки възможните стойности като низове, разделени със запетаи, вътре в набор от скоби, като това:
season ENUM('winter', 'spring', 'summer', 'autumn')
Подобен тип потребителски дефиниран тип е set
Тип. Като enum
тип, set
типове позволяват на потребителите да определят валидни стойности като низове при дефиниране. Разликата между тези два типа е в set
, повече от една стойност може да бъде съхранена за всеки запис.
Например, ако имате нужда от колона, която да представя дните от седмицата, в които доброволците са на разположение за работа, можете да имате set
колона като тази:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
При въвеждане на стойности за availability
колона, която току-що създадохме, предоставяте един низ със запетаи, разделящи всички дни, през които доброволецът е наличен. Например:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
За set
типове в MySQL, дублиращи се стойности във входа винаги се премахват и при извличане стойностите следват реда, използван в set
дефиниция независимо от реда при въвеждане в колоната.
JSON
MySQL поддържа колони в JSON с помощта на json
Тип. Данните се съхраняват като json
се съхранява в двоичен файл за по-бързо изпълнение и обработка, така че сървърът да не трябва да интерпретира низ, за да работи с JSON
стойности.
JSON
За работа с JSON
колони, MySQL предоставя редица функции за работа със стойности в документа.
Заключение
В тази статия разгледахме много от най-често срещаните типове данни, които са полезни при работа с MySQL бази данни. Има допълнителни типове, които не са обхванати в това ръководство, за които е полезно да знаете, но те представляват добра отправна точка за повечето случаи на употреба.
Важно е да използвате системата от типове по подходящ начин, за да можете да контролирате валидните стойности и да работите с данни, както се очаква. Има клопки, в които можете да срещнете, ако изберете тип, който не е подходящ за вашите данни, така че в повечето случаи си струва да помислите, преди да се ангажирате с тип данни.
Ако използвате Prisma Client за работа с вашите MySQL бази данни, можете да намерите съпоставяне между някои от често срещаните типове MySQL и Prisma в документите на Prisma за MySQL конектори за данни.