char(255 символов)
varchar(65535)
|
char(20) 20 символов
char фиксировано, при хранении добавляет справа PAD символы
|
tinytext(255)
text(65535)
mediumtext(16 млн)
longtext(4 млр)
|
если больше, то обрежутся конечные пробелы считаются при сортировке первые 1024 байта, но можно увеличить tinytext, text - можно не использовать |
tinyint(1)
smallint(2)
mediumint
int
bigint(8)
|
указано кол-во байтов
при создании указывается визуальное кол-во цифр+один символ на знак
CREATE TABLE employees (salary INTEGER(5) UNSIGNED);
int максимум 10, поэтому это преобразуется в int(11)
CREATE TABLE employees (id INT(255));
ZEROFILL заполняет 0 слева.
CREATE TABLE documents (document_no INT(5) ZEROFILL);
|
DECIMAL = NUMERIC |
фиксированное кол-во цифр. Равно int с коэффициентом деления.
Первая цифра - общее кол-во цифр (M), вторая - кол-во цифр после запятой. Знак неявно добавляется. Т.е. от -9.99 до 9.99
CREATE TABLE taxes (tax_rate DECIMAL(3, 2));
M < 65, по-умолчанию 10 при переборе ошибка, при выходе за пределы точности - округление по математическим правилам способ вывода больших чисел с игнором младших цифр
select truncate(tax_rate * 1000, 0) from taxes;
в агрегатных функциях работает общее ограничение на 64 цифры, вычисление точное.
|
float, double |
приближенные числа отображаются как были внесены, но в агрегатных функциях могут появиться неточности
CREATE TABLE typed_numbers(
id TINYINT,
float_values FLOAT,
decimal_values DECIMAL(3, 2));
INSERT INTO typed_numbers VALUES
(1, 1.1, 1.1),
(2, 1.1, 1.1),
(3, 1.1, 1.1);
SELECT * FROM typed_numbers;
| id | float_values | decimal_values |
+------+--------------+------------------+
| 1 | 1.1 | 1.10 |
| 2 | 1.1 | 1.10 |
| 3 | 1.1 | 1.10 |
SELECT SUM(float_values), SUM(decimal_values) FROM typed_numbers;
| SUM(float_values) | SUM(decimal_values) |
+--------------------+---------------------+
| 3.3000000715255737 | 3.30 |
Нельзя напрямую сравнивать в агрегатах, нужно сравнивать разницу ABS(v1 - v2) > 0.1
SELECT id, SUM(col1) as v1, SUM(col2) as v2
FROM temp
GROUP BY id
HAVING v1 <> v2;
нельзя, внешне одинаковые числа будут разными
|
битовый тип |
column_name BIT(M)
CREATE TABLE bit_values (val BIT(7));
INSERT INTO bit_values VALUES(b'1011'); - равно VALUES(b'0001011'), в этой нотации b и B равны.
INSERT INTO bit_values VALUES(0b1011);
INSERT INTO bit_values VALUES(2); - автоматическое преобразование числа в битовую маску
select выводит в виде 0x0A select bin(...) - без 0 слева select lpad(bin(...), 7, '0') - привычный вид с 0 слева
|
date
datetime
timestamp
year
time
|
00-00-0000 вместо NULL, не отображается
%а Краткое имя дня недели - Sun, Mon, ...
%b Краткое имя месяца — Jan, Feb, ...
%с Числовое значение месяца (0..11)
%d Числовое значение дня месяца (00..31)
%f Число микросекунд (000000..999999)
%Н Час дня в 24-часовом формате (00..23)
%h Час дня в 12-часовом формате (01..12)
%i Минуты в часе (00..59)
%j День года (001..366)
%М Полное имя месяца (January..December)
%m Числовое значение месяца
%р AM или РМ
%s Число секунд (00..59)
%W Полное имя дня недели (Sunday..Saturday)
%w Числовое значение дня недели (0=Sunday..6=Saturday)
%Y Значение года (четыре цифры)
timestamp зависит от time_zone
CREATE TABLE datetime_temp(ts TIMESTAMP, dt DATETIME);
INSERT INTO datetime_temp VALUES(NOW(), NOW());
SELECT ts, dt FROM datetime_temp;
| 2017-10-14 18:10:25 | 2017-10-14 18:10:25 |
SET time_zone = '+03:00';
SELECT ts, dt FROM datetime_temp;
| 2017-10-14 21:10:25 | 2017-10-14 18:10:25 |
Если сервер MAXDB mode, TIMESTAMP = DATETIME
column_name TIME;
838:59:59 to 838:59:59 + 6 цифр миллисекунд
некорректное в 00:00:00, нельзя отличить от корректно добавленного 00:00:00
|
|
|
|
|