Типи даних
Числові типи даних
Числа діляться на цілі та речові (число з крапкою)
Цілі числа
Типи | Байт | Від | До | Якщо UNSIGNED |
---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 255 |
SMALLINT | 2 | -32768 | 32767 | 65535 |
MEDIUMINT | 3 | -8388698 | 8388607 | 16777215 |
INT | 4 | -2137483648 | 2147483647 | 4294967295 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 18446744073709551615 |
Також цілі числа поділяють на типи:
- SIGNED – знакові (один біт йде на знак плюс або мінус)
- UNSIGNED – беззнакові, якщо значення лише позитивні, наприклад відстань, площа тощо. Це збільшить позитивне значення для типу в двоє, тобто TINYINT UNSIGNED буде від 0 до 255
Дробові числа
Усі речові числа в SQL суворо обумовленої точності
Псевдоніми типу:
- REAL(10,2)
- DECIMAL(10,2)
- FIXED(10,2)
- FLOAT(10,2)
Всі ці 4 функції псевдоніми, і принципової різниці в SQL між ними немає. Але о реалізаціях краще уточнити у документації.
Типи даних: дата та час
Типи | Значення | Байт |
---|---|---|
DATETIME | 0000-00-00 00:00:00 | 8 |
TIMESTAMP | 00000000000000 | 4 |
DATE | 0000-00-00 | 3 |
TIME | 00:00:00 | 3 |
YEAR | 0 | 1 |
Докладніше:
- 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 - використовується найчастіше з цих типів