Перейти до основного вмісту

Типи даних

Числові типи даних

Числа діляться на цілі та речові (число з крапкою)

Цілі числа

ТипиБайтВідДоЯкщо UNSIGNED
TINYINT1-128127255
SMALLINT2-327683276765535
MEDIUMINT3-8388698838860716777215
INT4-213748364821474836474294967295
BIGINT8-9223372036854775808922337203685477580718446744073709551615

Також цілі числа поділяють на типи:

  • SIGNED – знакові (один біт йде на знак плюс або мінус)
  • UNSIGNED – беззнакові, якщо значення лише позитивні, наприклад відстань, площа тощо. Це збільшить позитивне значення для типу в двоє, тобто TINYINT UNSIGNED буде від 0 до 255

Дробові числа

Усі речові числа в SQL суворо обумовленої точності

Псевдоніми типу:

  • REAL(10,2)
  • DECIMAL(10,2)
  • FIXED(10,2)
  • FLOAT(10,2)

Всі ці 4 функції псевдоніми, і принципової різниці в SQL між ними немає. Але о реалізаціях краще уточнити у документації.

Типи даних: дата та час

ТипиЗначенняБайт
DATETIME0000-00-00 00:00:008
TIMESTAMP000000000000004
DATE0000-00-003
TIME00:00:003
YEAR01

Докладніше:

  • DATETIME – для повноцінної дати та часу, великий за обсягом, приблизно 4-8 байт. Записується у вигляді рядка, і завжди записується від великого до меншого: рік, місяць, день, години, хвилини, секунди. Підтримуваний діапазон від ‘1000-01-01 00:00:00’ до ‘9999-12-31 23:59:59’. Якщо потрібно нижче, просто пишемо з мінусом ‘-500-01-09 00:00:00’.
  • TIMESTAMP – тимчасова мітка, діапазон епохи Юнікса 1970-01-01 00:00:00 — 2038-12-31 00:00:00
  • DATE – це лише дата без часу
  • TIME – тільки час
  • YEAR – тільки рік

Символьні типи даних

Типи CHAR та VARCHAR

Ці типи даних зберігають рядок певної довжини.

CHAR – зберігає символи завжди однакової довжини, так CHAR(10) буде завжди записано 10 символів (не байтів). Якщо задана межа типу 10, то завжди буде записано 10. Якщо у рядку не вистачає символів – буде доповнено пробілами, якщо символів багато - вони будуть обрізані.

VARCHAR – це змінний CHAR, має додатковий байт символізуючий кінець, так би мовити маркер кінця. Таким чином символи будуть бути рівно стільки, скільки ми ввели плюс 1 байт. Тобто при CHAR(4), порожній рядок важить 4 байти, а при VARCHAR(4) важить 1 байт, вага лише маркера. При переповненні рядок теж обрізається.

Порівняльна таблиця

ВеличинаCHAR(4)Потрібна пам'ятьVARCHAR(4)Потрібна пам'ять
'''                '4 байти''1 байт
'ab''ab        '4 байти'ab'3 байти
'abcd''abcd'4 байти'abcd'5 байтів
'abcdefgh''abcd'4 байти'abcd'5 байтів

Причина тоді використовувати CHAR, якщо VARCHAR є явно зручнішим. Але проблема не в економії місця, 1 байт на мільйонних таблицях дасть багато місця. Головне що пошук по CHAR працює набагато швидше. Якщо ми маємо явне значення, яке більше бути не може, як номер телефону, паспорта і т.д., немає сенсу робити це типом VARCHAR, ви уповільните базу і втратите байт на запис.

Припустимо, у нас рядки CHAR(3) запишемо їх у базу.

code
abc
bac
cab

Але в базі воно буде зберігатися приблизно так

abc bac cab

І якщо ми хочемо отримати третій запис, то база точно знає, що кількість символів в базі по 3, і вона просто почне читати з 7-го символу. У разі якщо б це був VARCHAR(3) їй би в цій же структурі довелося б переглянути всі записи для пошуку їх маркерів кінця запису, вона вже не може перегорнути 6 символів, так як рядки можуть бути не повними та різної довжини.

Типи даних TEXT

Це типи зберігання великого тексту крім TINYTEXT - це синонім VARCHAR. Якщо нам потрібно зберігати опис, відгуки або навіть книги, то це той тип, який потрібен.

  • TEXT - використовується найчастіше з цих типів