Въведение в типовете данни в SQL
За разлика от JavaScript, SQL има силно писане. Във всяка table всяка колона има свой собствен фиксиран тип данни.
Има много типове данни, но за разлика от езика Java, има толкова много от тях не защото има типове данни за всички случаи. Базите данни са много зависими от размера на данните, така че много типове данни се различават един от друг само по дължина.
Общо типовете данни могат да бъдат разделени на 5 групи:
- Числови типове
- Типове низове
- Видове за съхранение на дати и часове
- Обекти: обикновено се представят като колекция от byteове
- Транспорт : JSON и XML
Обикновено различните СУБД все още имат свои собствени типове данни. Всяка СУБД има своя собствена специализация, така че добавянето на нови типове данни е много обичайно нещо.
Друго нещо е, че просто добавянето на нов тип данни не е достатъчно, трябва да добавите функции, които ще работят с него, Howто и да направите тази работа удобна и бърза.
Ако работите върху индустриална (корпоративна) СУБД, тогава най-вероятно ще трябва да се справите с нейните типове данни и нейните функции. За Howво ще е необходимо да прочетете 2-5 добри книги.
Като част от нашето запознаване с SQL ще разгледаме три основни групи типове данни:
- Числа
- струни
- Дати
Числови типове в SQL
В SQL числовите типове са разделени на три групи:
- Целочислени типове
- Числа с фиксирана запетая (фиксиран брой десетични знаци)
- Числа с плаваща запетая
Да започнем с цели числа . Има само 5 от тях и могат да бъдат описани в една table:
# | Въведете име | Дължина в byteове | Аналог от Java | Минимална стойност | Максимална стойност |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | МАЛЪК | 2 | къс | -32,768 | 32,767 |
3 | СРЕДЕН | 3 | -8,388,608 | 8,388,607 | |
4 | ИНТР | 4 | вътр | -2,147,483,648 | 2,147,483,647 |
5 | BIGINT | 8 | дълго | -2 63 | 2 63-1 |
Типовете данни са много подобни на типовете данни на Java, но има и целочислен тип с дължина три byteа. Това се прави, за да се спести размер.
Следват типовете с плаваща запетая , точно Howто в Java, има само два от тях:
# | Въведете име | Дължина в byteове | Аналог от Java | Минимална стойност | Максимална стойност |
---|---|---|---|---|---|
1 | ПЛАВКА | 4 | плавам | -3.40E+38 | +1.18E+38 |
2 | ДВОЙНО | 8 | двойно | -1.79E+308 | +1.79E+308 |
Отново нищо ново. Всичко е същото като в Java. Въпреки това, за разлика от Java, SQL има друг специален тип, реално число с фиксирана точка. Нарича се DECIMAL.
Обикновено този тип се използва за съхраняване на парични суми. Когато се изписва името на този тип, тогава след него обикновено се посочва колко десетични знака има числото преди и след десетичната запетая. Общият формат изглежда така:
DECIMAL(total_characters, after_comma)
И малък пример:
salary DECIMAL(5,2)
Така описахме факта, че колоната за заплата може да съдържа цели числа (максимум 3 знака след десетичната запетая) и дробна част - 2 знака след десетичната запетая.
Максималният брой знаци, които типът DECIMAL поддържа, е 65.
Типове низове в SQL
Редовете в база данни могат да се съхраняват в две форми:
- Стрингове с фиксирана дължина
- Струнове с променлива дължина
Низовете с фиксирана дължина са посочени като CHAR :
CHAR(length)
Фиксирана дължина означава, че всички стойности на тази колона ще съдържат строго фиксиран брой знаци.
Пример за низ с фиксирана дължина:
country_code CHAR(2)
Низовете с променлива дължина се определят от типа VARCHAR :
VARCHAR(max_length)
Променливата дължина означава, че всички стойности на тази колона ще съдържат текст с произволна дължина, но не повече от максималната дължина.
Пример за низ с променлива дължина:
phone VARCHAR(12)
Струните с фиксирана дължина имат много голямо предимство. Ако клиентът поиска от SQL сървъра да му върне 1 000 000-ия ред от tableта и редовете в tableта са с фиксирана дължина, тогава, знаейки дължината на реда, можете лесно да изчислите byteовете, които се отнасят до желания ред.
В случай на променлива дължина на редовете, няма да е възможно бързо да намерите желания ред в tableта. Не забравяйте скоростта на достъп до ArrayList и LinkedList, тук ситуацията е приблизително същата.
Нека сравним How ще се съхраняват низове с различна дължина в table в зависимост от типа данни.
Линия | CHAR(4) | Байт за съхранение | VARCHAR(4) | Байт за съхранение | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
"аб" | "аб" | 4 | "аб" | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
„abcdefgh“ | 'abcd' | 4 | 'abcd' | 5 |
Забележка. Типът VARCHAR изисква още един byte за същата дължина, защото трябва допълнително да съхранява дължината на низа.
Временни типове в SQL
SQL има и специални типове за съхраняване на дати и часове. Има общо пет вида:
# | Въведете име | Аналог от Java DateTime API | Пример | Минимална стойност | Максимална стойност |
---|---|---|---|---|---|
1 | ДАТА | Местна дата | „30.06.2022“ | "1000-01-01" | "9999-12-31" |
2 | ВРЕМЕ | Местно време | 'чч:мм:сс[.фракция]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | ВРЕМЕ ЗА СРЕЩА | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | КЛАПОТО ЗА ЧАС | Дата | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | ГОДИНА | 1901 г | 2155 |
Всички данни в заявките се записват като низ – в единични кавички. Форматът за въвеждане е от най-големия към най-малкия:
- година
- месец
- ден
- час
- minutesа
- Второ
- Части от секундата
Типовете DATE, TIME и DATETIME могат условно да се считат за аналози на типовете от Java DateTme API: LocalDate, LocalTime, LocalDateTime. Логиката е почти същата.
Типът TIMESTAMP съхранява данни в мorсекунди от началото на 1970 г. (стандарт за операционна система UNIX). Именно в този вид те се съхраняват от типа Дата на езика Java.
И накрая, има тип YEAR, който е дълъг 1 byte и съхранява стойности от 1 до 255. Следователно диапазонът от години, с който разполага, е 1901-2155. Годината 1900 не може да бъде съхранена от този тип, тъй като стойността 0 се използва за codeиране на NULL стойност.
Съхраняване на обекти в SQL
Има специални видове за съхраняване на обекти or текстове с голяма дължина. Няма да навлизаме в подробности за тях, но все пак ще ги изброя:
# | Въведете име | Обяснение |
---|---|---|
1 | ТЕКСТ | Използва се за съхраняване на дълги текстове. При сравняване и сортиране в това поле се използват само първите 100 знака. |
2 | BLOB | Името означава Byte Large Object. Съхранява се просто като колекция от byteове. Може да се използва например за съхраняване на снимки в база данни. |
3 | CLOB | Името означава Char Large Object. Използва се за съхраняване на дълги текстове. |
4 | ENUM | Позволява ви да зададете фиксиран набор от стойности и да съхраните една от тях като стойност. |
5 | КОМПЛЕКТ | Позволява ви да зададете фиксиран набор от стойности и да съхранявате всяко подмножество от тях като стойност. Обикновено ги съхранява като двоична маска. |
Теоретично можете да сериализирате всеки Java обект като набор от byteове и да го съхраните в базата данни като BLOB. Запазването на обекта не е проблем. Как да работим с него по-нататък?
Да кажем, че една table съхранява мorон обекта в сериализирана форма - How ще търсите в тях? СУБД поддържа само определен тип данни, когато предоставя обширен набор от функции за работа с тях.
GO TO FULL VERSION