Как уже говорилось, многие современные СУБД используют язык SQL в качестве основного языка управления схемой БД и хранимыми в ней данными.
Существует одна оговорка: стандарт ANSI SQL в разных СУБД реализован в разной степени, к тому же многие СУБД используют несовместимые с ANSI SQL и другими СУБД расширения.
Так, например, Microsoft SQL Server имеет расширение PIVOT
для составления запросов выборки, в которых столбцы генерируются на основе строк, postgreSQL предлагает процедурные расширения pg/SQL, и т.п.
Мы в основном будем пользоваться MySQL, придерживаясь стандарта ANSI. Я постараюсь отдельно оговаривать расширения.
MySQL
MySQL – проект с открытым исходным кодом и распространяется по лицензии GNU GPL. Существует на рынке с 1995 года.
Изначально разрабатывался и финансировался компанией MySQL AB, в 2008 году куплен компанией Sun Microsystems (Java, Solaris), а в 2010, вместе c Sun – компанией Oracle.
MySQL крайне популярен в веб-проектах: большинство хостингов в качестве СУБД предлагает именно его.
MySQL написан на C++, и работает на большинстве современных ОС.
Типы данных в MySQL
Говоря о типах данных, по сути имеются ввиду домены атрибутов. Большинство СУБД имеют некоторый (вообще говоря достаточно большой) набор встроенных типов данных, а многие так же позволяют пользователю определять новые. Я, конечно, не буду перечислять все возможные типы данных, и остановлюсь на наиболее часто используемых.
Символьные данные
Символьные данные – это строки фиксированной и переменной длины. При использовании символьных данных, требуется, как правило, указать максимальную длину строки.
В SQL это типы CHAR
– строка фиксированной длины и VARCHAR
– строка переменной длины.
Строки фиксированной длины дополняются справа пробелами до указанной длины.
Одно важное замечание: VARCHAR
удаляет все пробелы в конце строки.
Тип | Макс. длина |
---|---|
CHAR |
255 символов |
VARCHAR |
65535 символов |
CHAR
хорошо подходит для хранения буквенно-цифровых кодов, скажем, сокращенных названий стран, телефонных или автомобильных номеров, и т.п. VARCHAR
обычно используется для хранения сравнительно коротких строк, таких, как имена, пароли и т.п.
Если Вы пытаетесь поместить в колонку типа CHAR(n)
или VARCHAR(n)
строку, имеющую длину, превышающую длину для типа (n
), генерируется ошибка.
Важно так же отметить, что длина строки задается в символах, и ее фактический размер в байтах зависит от кодировки. MySQL позволяет задавать кодировки как для столбцов, так и для БД целиком при помощи спецификатора CHARACTER SET
.
Так, в частности, CHAR(20) CHARACTER SET utf8
создаст строку фиксированной длины с кодировкой UTF-8. Так же можно создать БД с кодировкой “по умолчанию”: CREATE DATABASE dbname CHARACTER SET utf8
. В качестве общей рекомендации, создавайте базы с кодировкой UTF-8 – это часто спасает от головной боли впоследствии.
Текстовые данные
Если 255 символов недостаточно, можно использовать различные типы *text.
Тип | Макс. длина |
---|---|
tinytext |
255 байт |
text |
65 535 байт |
mediumtext |
16 777 215 байт |
longtext |
4 294 967 295 байт |
Замечание: разные типы текстовых данных – особенность MySQL
Используя *text, необходимо помнить следующее:
- Сравнение игнорирует пробелы в конце строки, т.е.
'a'
и'a '
– с точки зрения MySQL одинаковы - Выборка текстовых данных менее эффективна, поэтому без необходимости не следует, скажем, выполнять
SELECT *
на таблицах с текстовыми данными.
Числовые данные
Имеются целочисленные типы, типы с фиксированной запятой, типы с плавающей запятой. Типы можно сделать знаковыми (по умолчанию) или беззнаковыми (указав UNSIGNED
), например, INT UNSIGNED
(так же работает для типов с фиксированной и плавающей запятыми, что, однако, лишь ограничивает возможный диапазон значений положительными числами)
Тип | Длина (байт) | Мин | Макс |
---|---|---|---|
TINYINT | 1 | -128 | 127 |
0 | 255 | ||
SMALLINT | 2 | -32768 | 32767 |
0 | 65535 | ||
MEDIUMINT | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
INT | 4 | -2147483648 | 2147483647 |
0 | 4294967295 | ||
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
Тип с фиксированной запятой в принципе один – DECIMAL
или, что то же самое, NUMERIC
. При определении этого типа, необходимо указать общее количество десятичных знаков и точность (количество знаков после запятой). Скажем, DECIMAL(5,2)
будет представлять числа от -999.99
до 999.99
. Максимальное количество десятичных знаков – 65.
Указание DECIMAL(N)
эквивалентно DECIMAL(N,0)
, т.е. целому числу из N
десятичных знаков.
Указание DECIMAL
эквивалентно DECIMAL(10)
.
Типы с плавающей запятой представлены стандартными FLOAT
(одинарная точность, 4 байта) и DOUBLE
(двойная точность, 8 байт). В качестве расширения, MySQL позволяет указать количество десятичных знаков и точность (количество знаков после запятой), как для типа DECIMAL. Надо, однако, иметь в виду, что типы с плавающей запятой не всегда могут представить числа точно.
Временные данные (дата/время)
Тип | Формат | Мин | Макс |
---|---|---|---|
DATE |
YYYY-MM-DD |
1000-01-01 |
9999-12-31 |
DATETIME |
YYYY-MM-DD HH:MI:SS |
1000-01-01 00:00:00 |
9999-12-31 23:59:59 |
TIMESTAMP |
YYYY-MM-DD HH:MI:SS |
1970-01-01 00:00:00 |
2037-12-31 23:59:59 |
YEAR |
YYYY |
1901 |
2155 |
TIME |
HHH:MI:SS |
-838:59:59 |
838:59:59 |
Тип TIMESTAMP
позволяет автоматически инициализировать значение текущим временем как при вставке, так и при обновлении.
Перечисление
MySQL поддерживает тип строкового перечисления. Это тип данных, который позволяет хранить только заранее определенные строки. Задается он как ENUM(values...)
, например ENUM('M', 'F')
.
Следует иметь в виду, что тип перечисления сортируется в порядке перечисления, т.е. колонка с типом ENUM('c','b','a')
следующего вида
a |
b |
c |
b |
a |
c |
будет отсортирована в порядке возрастания как
c |
c |
b |
b |
a |
a |
ENUM
позволяет так же использовать индекс вместо самого значения. Так, например, в предыдущем примере, 'c'
соответствует 1
, 'b'
– 2
и 'a'
– 3
. Следует это помнить и проявлять аккуратность при работе с этим типом. Скажем, при работе с ENUM('0', '1', '2')
можно ошибиться и забыть поставить кавычки. Тогда значение 1
превратится в '0'
, что может быть неожиданно и нежелательно.
Если колонка объявлена как NOT NULL
и не указано значение по умолчанию, то в качестве значения по умолчанию используется первый элемент перечисления.
Максимальное количество значений в ENUM
– 65535, хотя на практике использование более 3000 не рекомендуется.
Таблица может содержать не более 255 различных определений типов ENUM
NULL
Любая колонка, независимо от типа, которая не объявлена как NOT NULL
, может содержать особое значение NULL
. Значение NULL
интерпретируется как “не заданное значение”, то есть “ничего”.