СУБД, использующие язык SQL. MySQL.

Как уже говорилось, многие современные СУБД используют язык 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 интерпретируется как “не заданное значение”, то есть “ничего”.