Mysql
 sql >> база данни >  >> RDS >> Mysql

Въведение в MySQL типовете данни


Въведение

Една от основните характеристики на релационните бази данни като цяло е способността да се дефинират схеми или структури на таблици, които точно определят формата на данните, които ще съдържат. Това става чрез предписване на колоните, които тези структури съдържат заедно с техния тип данни и всякакви ограничения.

Типовете данни определят общ модел за данните, които приемат и съхраняват. Стойностите трябва да се придържат към изискванията, които те очертават, за да бъдат приети от 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 конектори за данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 начина за „дехексиране“ на низ в MySQL

  2. Преобразувайте символите latin1 в UTF8 таблица в UTF8

  3. Как да деактивирате стриктния режим на MySQL

  4. Как да създадете база данни с множество наематели със споделени структури на таблици?

  5. Как да инсталирате MySQL с phpMyAdmin на Ubuntu 14.04