SQL — Урок 2. Типы данных
Этот урок носит больше теоретический характер, но пропустить его нельзя. В дальнейшем вы сможете возвращаться к нему, как к справочному уроку, сейчас же просто ознакомьтесь. В прошлом уроке говорилось, что MySQL поддерживает числовые, строковые, календарные данные и данные типа NULL. Рассмотрим их по очереди.
Числовые типы данных
| Тип данных | Объем памяти | Диапазон | Описание |
| TINYINT (M) | 1 байт | от -128 до 127 или от 0 до 255 | Целое число. Может быть объявлено положительным с помощью ключевого слова UNSIGNED, тогда элементам столбца нельзя будет присвоить отрицательное значение. Необязательный параметр М — количество отводимых под число символов. Необязательный атрибут ZEROFILL позволяет свободные позиции по умолчанию заполнить нулями. |
TINYINT — хранит любое число в диапазоне от -128 до 127.
TINYINT UNSIGNED — хранит любое число в диапазоне от 0 до 255.
TINYINT (2) — предполагается, что значения будут двузначными, но по факту будет хранить и трехзначные.
SMALLINT — хранит любое число в диапазоне от -32768 до 32767.
SMALLINT UNSIGNED — хранит любое число в диапазоне от 0 до 65535.
SMALLINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и пятизначные.
MEDIUMINT — хранит любое число в диапазоне от -8388608 до 8388608.
MEDIUMINT UNSIGNED — хранит любое число в диапазоне от 0 до 16777215.
MEDIUMINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и семизначные.
INT — хранит любое число в диапазоне от -2147683648 до 2147683648.
INT UNSIGNED — хранит любое число в диапазоне от 0 до 4294967295.
INT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
BIGINT — хранит любое число в диапазоне от -2 63 до 2 63 -1.
BIGINT UNSIGNED — хранит любое число в диапазоне от 0 до 2 64 .
BIGINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
Необходимо понимать, чем больше диапазон значений у типа данных, тем больше памяти он занимает. Поэтому, если предполагается, что значения в столбце не будут превышать 100, то используйте тип TINYINT. Если при этом все значения будут положительными, то используйте атрибут UNSIGNED. Правильный выбор типа данных позволяет сэкономить место для хранения этих данных.
Строковые типы данных
| Тип данных | Объем памяти | Максимальный размер | Описание |
| CHAR (M) | M символов | М символов | Позволяет хранить строку фиксированной длины М. Значение М — от 0 до 65535. |
Календарные типы данных
| Тип данных | Объем памяти | Диапазон | Описание |
| DATE | 3 байта | от ‘1000-01-01’ до ‘9999-12-31’ | Предназначен для хранения даты. В качестве первого значения указывается год в формате «YYYY», через дефис — месяц в формате «ММ», а затем день в формате «DD». В качестве разделителя может выступать не только дефис, а любой символ отличный от цифры. |
| TIME | 3 байта | от ‘-838:59:59’ до ‘838:59:59’ | Предназначен для хранения времени суток. Значение вводится и хранится в привычном формате — hh:mm:ss, где hh — часы, mm — минуты, ss — секунды. В качестве разделителя может выступать любой символ отличный от цифры. |
| DATATIME | 8 байт | от ‘1000-01-01 00:00:00’ до ‘9999-12-31 23:59:59’ | Предназначен для хранения и даты и времени суток. Значение вводится и хранится в формате — YYYY-MM-DD hh:mm:ss. В качестве разделителей могут выступать любые символы отличные от цифры. |
| TIMESTAMP | 4 байта | от ‘1970-01-01 00:00:00’ до ‘2037-12-31 23:59:59’ | Предназначен для хранения даты и времени суток в виде количества секунд, прошедших с полуночи 1 января 1970 года (начало эпохи UNIX). |
| YEAR (M) | 1 байт | от 1970 до 2069 для М=2 и от 1901 до 2155 для М=4 | Предназначен для хранения года. М — задает формат года. Например, YEAR (2) — 70, а YEAR (4) — 1970. Если параметр М не указан, то по умолчанию считается, что он равен 4. |
Тип данных NULL
Вообще-то это лишь условно можно назвать типом данных. По сути это скорее указатель возможности отсутствия значения. Например, когда вы регистрируетесь на каком-либо сайте, вам предлагается заполнить форму, в которой присутствуют, как обязательные, так и необязательные поля. Понятно, что регистрация пользователя невозможна без указания логина и пароля, а вот дату рождения и пол пользователь может указать по желанию. Для того, чтобы хранить такую информацию в БД и используют два значения:
NOT NULL (значение не может отсутствовать) для полей логин и пароль,
NULL (значение может отсутствовать) для полей дата рождения и пол.
По умолчанию всем столбцам присваивается тип NOT NULL, поэтому его можно явно не указывать.
create table users (login varchar(20), password varchar(15), sex enum(‘man’, ‘woman’) NULL, date_birth date NULL);
Таким образом, мы создаем таблицу с 4 столбцами: логин (не более 20 символов) обязательное, пароль (не более 15 символов) обязательное, пол (мужской или женский) не обязательное, дата рождения (тип дата) необязательное.
Все, на этом урок, посвященный типам данных, закончен. У вас, возможно, остались вопросы, но они исчезнут по мере освоения дальнейшего материала, т.к. на практике все становится более понятно, чем в теории.
Научись программировать на Python прямо сейчас!
- Научись программировать на Python прямо сейчас
- Бесплатный курс
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Типы данных в MySQL
В этой инструкции рассказываем про основные типы данных в MySQL и даем советы, где лучше использовать тот или иной тип.
Эта инструкция — часть курса «MySQL для новичков».
Смотреть весь курс
Введение
При создании таблиц в MySQL для каждого столбца нужно указывать тип данных. Он определяет, какие данные там могут храниться, как будут обрабатываться и сколько места будут занимать. В MySQL все типы данных делятся на несколько классов: числовые типы, символьные, дата/время и так далее. В каждом классе есть несколько типов данных, которые внешне могут быть похожи, но их поведение или принципы хранения отличаются. Важно выбрать правильный тип сразу при создании таблицы, потому что потом готовую структуру и приложения будет сложней переделать.
В этой статье мы расскажем об основных типах данных в MySQL и дадим советы, где лучше использовать тот или иной тип.
Возможности MySQL в «Облачных базах данных»
Числовые типы
Используются для хранения чисел. Бывают целочисленными, с плавающей точкой и с фиксированной точкой.
Целые числа
Хранят только целые числа, без дробной части. Делятся на signed (со знаком) и unsigned (без знака). Типы singed позволяют хранить как положительные, так и отрицательные значения. Типы unsigned хранят только положительные числа, но зато диапазон значений больше. Это может быть полезно в случаях, когда хранимые значения заведомо не могут быть отрицательным. Например, количество товара или идентификатор записи в таблице.
| Тип | Размер (байт) | Диапазон signed | Диапазон unsigned |
| TINYINT | 1 | -128 … 127 | 0 … 255 |
| SMALLINT | 2 | -3 2768 … 32 767 | 0 … 65 535 |
| MEDIUMINT | 3 | -8 388 608 … 8388607 | 0 … 16 777 215 |
| INT | 4 | 2 147 483 648 … 2 147 483 647 | 0 … 42 94 967 295 |
| BIGINT | 8 | -2 63 … 2 63 -1 | 0 … 2 64 -1 |
Числа с плавающей точкой
Хранят приблизительные значения. Не резервируют определенное количество бит для целочисленной или дробной частей. Поэтому у всех значений в таблице количество до и после запятой будет разным.
| Тип | Размер (байт) | Диапазон |
| FLOAT | 4 | -3.402823466E+38 … -1.175494351E-38 и 1.175494351E-38 … 3.402823466E+38 |
| DOUBLE | 8 | -1.7976931348623157E+308 … -2.2250738585072014E-308 и2.2250738585072014E-308 … 1.7976931348623157E+308 |
До версии MySQL 8.0.17 эти типы данных поддерживали диапазон unsigned, но он работал не так, как с целыми числами. Беззнаковый диапазон просто запрещал сохранять отрицательные значения, при этом максимальное значение не увеличивалось. Начиная с версии 8.0.17, использование unsigned не рекомендуется и считается устаревшим. В будущих версиях MySQL поддержку беззнакового диапазона для этого типа данных могут вовсе удалить.
Числа с фиксированной точкой
Эти типы данных используются для сохранения заданной точности. Такие числа резервируют определенное количество бит для целочисленной и дробной частей. Независимо от того, насколько большое или маленькое число, оно всегда будет использовать одно и то же количество бит для сохранения каждой части. Эти типы данных подходят для случаев, когда важна точность, например, деньги.
В MySQL для хранения чисел с фиксированной точкой используются типы DECIMAL(M,D) и NUMERIC(M,D), но по факту это синонимы. Можно использовать любой из этих типов, результат будет одинаковым. В таких столбцах максимально можно хранить до 65 чисел вместе с целочисленной и дробной частями.
Символьные (строковые)
Символьные типы используются для хранения текстов. Есть два основных типа: CHAR и VARCHAR. С точки зрения пользователя они выглядят похоже, но MySQL хранит и обрабатывает их по-разному.
- CHAR хранит строку фиксированной длины до 255 символов. Если длина вставляемой записи меньше, то MySQL автоматически дополняет значение пробелами. Например, если мы указали тип CHAR(10) и сохранили строку «Привет», то по факту в БД будет храниться строка «Привет » (обратите внимание на четыре пробела в конце строки).
Кажется, что это лишняя трата места. Но если во всех ваших записях хранятся строки примерно одной длины, то тип CHAR будет очень производительным. Например, его можно использовать для хранения хешей, у которых длина всегда одинакова.
- VARCHAR хранит строки переменной длины до 65 535 символов. Причем в памяти хранится именно та длина, которая была указана при создании. VARCHAR занимает меньше места, чем CHAR, но подвержен фрагментации и из-за этого может проигрывать в скорости обработки данных.
Текстовые и бинарные
Текстовые (TEXT) и бинарные (BLOB) типы данных используются для хранения больших объемов текста или двоичных данных. Эти типы похожи, но отличаются по способу хранения и обработки внутри MySQL.
- BLOB обрабатывается как двоичные данные. В нем не хранится набор символов, а операции сортировки и сравнения основаны на числовых значениях байтов.
- TEXT обрабатывается как символьные строки. В нем хранится именно набор символов, а значения сортируются и сравниваются на основе сопоставления набора символов..
Текстовые типы отлично подходят для хранения больших текстов: статей, докладов и так далее. А бинарные типы могут хранить любые файлы или мультимедиа-контент.
| Тип | Размер (байт) | Макс. размер символов |
| TINYTEXT / TINYBLOB | 255 | 255 |
| TEXT / BLOB | 65 535 | 65 535 |
| MEDIUMTEXT / MEDIUMBLOB | 16 777 215 | 2 24 -1 |
| LONGTEXT / LONGBLOB | 4 294 967 295 | 2 32 -1 |
Кажется, что типы TINYTEXT и TEXT похожи на CHAR и VARCHAR. Но разница в том, что MySQL не умеет индексировать текстовые и бинарные типы и не может использовать индексы для сортировки.
Дата/время
Типы данных, которые позволяют работать с датой и временем.
| Тип | Размер (байт) | Описание |
| DATE | 3 | Только дата в формате YYYY-MM-DD. Допустимые значения от 1000-01-01 до 9999-12-31 |
| DATETIME | 8 | Дата и время в формате YYYY-MM-DD HH:MM:SS. Допустимые значения от 1000-01-01 00:00:00 до 9999-12-31 23:59:59 |
| TIMESTAMP | 4 | Дата и время. Хранится в виде количества секунд, прошедших с 1 января 1970 года по гринвичу. Занимает в два раза меньше места, чем тип DATETIME. Но при этом диапазон ограничен значениями от 1970-01-01 00:00:01 до 2038-01-09 03:14:07 |
| TIME | 3 | Только время в формате HH:MM:SS. Допустимые значения от 00:00:00 до 23:59:59 |
| YEAR(N) | 1 | Только год в формате YYYY или YY. Допустимые значения от 1901 до 2155 или от 70 до 69 (1970 — 2069) |
JSON
Это относительно новый тип данных, который появился в MySQL версии 5.7.8. Он позволяет нативно хранить и обрабатывать данные в JSON-формате.
В отличие от хранения объектов в виде текста, в использовании специального типа данных есть несколько преимуществ:
- Валидация JSON-объектов. Если попытаться сохранить неправильный JSON, MySQL сгенерирует ошибку.
- Возможность нативно работать с JSON, выбирать и обновлять только отдельные части объектов, а не весь объект целиком.
- MySQL сохраняет тип JSON в специальном внутреннем формате. Такой способ более производительный, чем работа с JSON в виде строки.
Составные типы
Строковые типы данных, которые могут хранить значения только из заранее определенного списка. Несмотря на то, что список значений состоит из строк, в самих таблицах хранятся только числа, которые ассоциированы со справочником возможных значений. Поэтому они занимают мало места.
- ENUM может хранить только одно значение из списка, занимает 1-2 байта.
- SET может хранить одновременно до 64 значений из списка, занимает от 1 до 8 байт.
Заключение
Мы рассмотрели основные типы данных и полей в MySQL, объяснили разницу между схожими типами. Теперь вы можете создавать свои структуры БД, используя полученные знания.
Создание базы данных в MySQL
Unsigned sql что это
MySQL поддерживает несколько типов столбцов, которые можно разделить на три категории: числовые типы данных, типы данных для хранения даты и времени и символьные (строковые) типы данных. В данном разделе вначале дается обзор всех возможных типов и приводятся требования по хранению для каждого типа столбца, затем свойства типов описываются более подробно по каждой категории. Мы намеренно сделали обзор кратким, поскольку более детальные описания требуют дополнительной информации о конкретных типах столбцов, например, о допустимых форматах представления величин.
Ниже перечислены типы столбцов, поддерживаемые MySQL. В описаниях используются следующие обозначения:
M Указывает максимальный размер вывода. Максимально допустимый размер вывода составляет 255 символов. D Употребляется для типов данных с плавающей точкой и указывает количество разрядов, следующих за десятичной точкой. Максимально возможная величина составляет 30 разрядов, но не может быть больше, чем M -2.
Квадратные скобки ( `[‘ и `]’ ) указывают для типа данных группы необязательных признаков.
Заметьте, что если для столбца указать параметр ZEROFILL , то MySQL будет автоматически добавлять в этот столбец атрибут UNSIGNED .
Предупреждение: следует помнить, что при выполнении вычитания между числовыми величинами, одна из которых относится к типу UNSIGNED , результат будет беззнаковым! See section 6.3.5 Функции приведения типов.
- Все арифметические операции выполняются с использованием значений BIGINT или DOUBLE со знаком, так что не следует использовать беззнаковые целые числа больше чем 9223372036854775807 (63 бита), кроме операций, выполняемых логическими функциями. В противном случае несколько последних разрядов результата могут оказаться ошибочными из-за ошибок округления при преобразовании BIGINT в DOUBLE . MySQL 4.0 может обрабатывать данные типа BIGINT в следующих случаях:
- Использование целых чисел для хранения больших беззнаковых величин в столбце с типом BIGINT .
- В случаях MIN(big_int_column) и MAX(big_int_column) .
- При использовании операторов ( `+’ , `-‘ , `*’ и т.д.), когда оба операнда являются целыми числами.
Главы
- 6.2.1 Числовые типы данных
- 6.2.2 Типы данных даты и времени
- 6.2.2.1 Проблема 2000 года и типы данных
- 6.2.2.2 Типы данных DATETIME , DATE и TIMESTAMP
- 6.2.2.3 Тип данных TIME
- 6.2.2.4 Тип данных YEAR
- 6.2.3.1 Типы данных CHAR и VARCHAR
- 6.2.3.2 Типы данных BLOB и TEXT
- 6.2.3.3 Тип перечисления ENUM
- 6.2.3.4 Тип множества SET
Справочник по MySQL : SQL : Типы данных, используемые в базе данных MySQL
Необязательный флаг UNSIGNED задает, что будет создано поле для хранения без знаковых чисел (больших или равных 0).
TINYINT Может хранить числа от -128 до 127 SMALLINT Диапазон от -32 768 до 32 767 MEDIUMINT Диапазон от -8 388 608 до 8 388 607 INT Диапазон от -2 147 483 648 до 2 147 483 647 BIGINT Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 Дробные числа
Точно так же, как целые числа подразделяются в MySQL на несколько разновидностей, MySQL поддерживает и несколько типов дробных чисел.
В общем виде они записываются так:
ИмяТипа[(length, decimals)] [UNSIGNED]
Здесь length — количество знакомест (ширина поля), в которых будет размещено дробное число при его передаче.
decimals — количество знаков после десятичной точки, которые будут учитываться.
UNSIGNED — задает беззнаковые числа. FLOAT Число с плавающей точкой небольшой точности. DOUBLE Число с плавающей точкой двойной точности. REAL Синоним для DOUBLE. DECIMAL Дробное число, хранящееся в виде строки. NUMERIC Синоним для DECIMAL.
Строки
Строки представляют собой массивы символов. Обычно при поиске по текстовым полям по запросу SELECT не берется в рассмотрение регистр символов, т.е. строки «Вася» и «ВАСЯ» считаются одинаковыми. Кроме того, если база данных настроена на автоматическую перекодировку текста при его помещении и извлечении, эти поля будут храниться в указанной вами кодировке.
Для начала ознакомимся с типом строки, которая может хранить не более length символов, где length принадлежит диапазону от 1 до 255.
VARCHAR (length) [BINARY]
При занесении некоторого значения в поле такого типа из него автоматически вырезаются концевые пробелы. Если указан флаг BINARY, то при запросе SELECT строка будет сравниваться с учетом регистра.
VARCHAR Может хранить не более 255 символов. TINYTEXT Может хранить не более 255 символов. TEXT Может хранить не более 65 535 символов. MEDIUMTEXT Может хранить не более 16 777 215 символов. LONGTEXT Может хранить не более 4 294 967 295 символов. Чаще всего применяется тип TEXT, но если вы не уверены, что данные не будут превышать 65 536 символов, используйте LONGTEXT.
Бинарные данные
Бинарные данные — это почти то же самое, что и данные в формате TEXT, но только при поиске в них учитывается регистр символов.
TINYBLOB Может хранить не более 255 символов. BLOB Может хранить не более 65 535 символов. MEDIUMBLOB Может хранить не более 16 777 215 символов. LONGBLOB Может хранить не более 4 294 967 295 символов. BLOD-данные не перекодируются автоматически, если при работе с установленным соединением включена возможность перекодирования текста «на лету».
Дата и время
MySQL поддерживает несколько типов полей, специально приспособленных для хранения дат и времени в различных форматах.
DATE Дата в формате ГГГГ-ММ-ДД TIME Время в формате ЧЧ:ММ:СС DATETIME Дата и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС TIMESTAMP Дата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГММДДЧЧММСС, что сильно умаляет преимущества его использования в PHP
