
Календарные данные
СУБД MySQL имеет 5 видов столбцов для хранения календарных типов данных: DATE, DATETIME, TIME, TIMESTAMP и YEAR (табл. 5). Тип DATE предназначен для хранения даты, TIME для времени суток, a TIMESTAMP для представления и даты, и времени суток. Тип TIMESTAMP предназначен для представления даты и времени суток в виде числа секунд, прошедших с полуночи 1 января 1970 года. Тип данных year позволяет хранить только год.
Таблица 5. Календарные типы данных
Для значений, имеющих тип DATE и DATETIME, в качестве первой цифры ожидается год либо в формате "YYYY", например '2005-10-15', либо в формате "YY", например
'05-10-15'. После года через дефис указывается месяц в формате "ММ" (10), а затем день в формате "DD" (15).
В типах TIME и DATETIME время приводится в привычном формате hh:mm:ss, где hh — часы, mm — минуты, a ss — секунды. Дни, месяцы, часы, минуты и секунды можно записывать как с ведущим нулем: 01, так и без него: 1.-Например, все следующие записи идентичны:
'2005-04-06 02:04:08'
'2005-4-06 02:04:08'
'2005-4-6 02:04:08'
'2005-4-6 2:04:08'
'2005-4-6 2:4:08'
'2005-4-6 2:4:8'
В качестве разделителя между годами, месяцами, днями, часами, минутами, секундами может выступать любой символ, отличный от цифры. Так, следующие значения идентичны:
'05-12-31 11:30:45'
'05.12.31 11+30+45'
'05/12/31 11*30*45'
'05@12@31 11^30^45'
Дата и время суток могут также быть представлены в форматах 'YYYYMMDDhhmmss' и YYMMDDhhmmss'. Например, строки '2005091528' и '050523091528' аналогичны '2005-05-23 09:15:28', однако строка '051122129015' уже не может рассматриваться как дата и время суток, т. к. значение для минут равно 90 и выходит за допустимый интервал. Вместо строк допустимы и целочисленные значения, например, 2005091528 и 0523091528 рассматриваются как '2005-05-23 09:15:28'.
Начиная с версии MySQL 4.1.1, при указании времени суток после секунд через точку можно также указать микросекунды, т.е. использовать расширенный формат вида 'hh:mm:ss.ffffrr’, например '10:25:14.000001'. Кроме расширенного формата, можно использовать краткие форматы 'НН:ММ' и 'НН' — вместо пропущенных величин будут подставлены нулевые значения.
Если время задается в недопустимом формате, то в поле записывается нулевое значение. Нулевое значение присваивается полям временного типа по умолчанию, когда им не присваивается инициирующее значение (табл. 6).
Формат типа timestamp совпадает с DATETIME, но во внутреннем представлении дата хранится в виде секунд, прошедших с полуночи 1 января 1970 года.
Если в таблице несколько столбцов TIMESTAMP, при модификации записи текущее время будет записываться только в один из столбцов (по умолчанию первый). Можно также указать явно столбец, которому необходимо назначать текущую дату при создании новой записи или изменении старой. Для того чтобы поля столбца принимали текущую дату при создании новой записи, следует после определения столбца добавить запись DEFAULT CURRENT_TIMESTAMP. Если требуется, чтобы текущее время выставлялось при модификации уже существующей записи, при использовании оператора update следует добавить конструкцию on update CURRENT_TIMESTAMP.
Тип данных NULL
Реляционная база данных позволяет объединить многочисленные данные в одну таблицу и при помощи SQL-запросов проводить над ней различные манипуляции, получая результат в виде чисел и строк, а также новых таблиц. При создании таблицы неизбежны случаи, когда информации недостаточно и для части данных нельзя определить, какое значение они примут. Такие данные обозначаются специальным типом — NULL.
Например, в форме регистрации пользователь обязательно должен указать фамилию, имя, отчество. Кроме того, по желанию он может указать свой e-mail и URL домашней страницы.
Замечание
Комментарий в SQL начинается с двух дефисов "—", все что расположено правее, считается комментарием. Непосредственно после "-" должен следовать пробел. Помимо стандартного комментария, MySQL содержит ряд собственных комментариев. Shell-комментарий # действует аналогично "—", все что расположено правее его, является текстом комментария. С-комментарий /* */ является многострочным — комментарий начинается с "/*" и заканчивается только тогда, когда встретится завершение "*/".
Посетитель обязан указать свои фамилию, имя и отчество, но может не указывать e-mail и адрес домашней страницы, даже несмотря на то, что они у него имеются в наличии. Таким образом, если для полей email и url нет информации, это не значит, что ее нет в природе, просто на данный момент она неизвестна. Такие поля принимают значение null — отсутствие информации, т. е. неопределенное значение. Выполнение арифметических операций с данными типа null всегда дает null, передача null в качестве аргумента функции также всегда приводит к значению типа null. Любые действия, производимые над неопределенным значением, приводят опять к неопределенному значению.
Для указания того факта, что поле может принимать значение null, в определении столбца, после типа данных следует указать ключевое слово null, если поле ни при каких обстоятельствах не должно принимать поле null (регистрация невозможна, если фамилия пользователя неизвестна), следует указать ключевое слово not null
Замечание
Атрибут not null можно не указывать, т. к. он присваивается столбцу по умолчанию, если никакой из атрибутов не указан.
Совместно с атрибутами NOT NULL и NULL можно использовать DEFAULT, который имеет больший приоритет.
Выбор типа данных
При выборе типа данных следует помнить, что обработка числовых данных происходит быстрее строковых. Так как типы данных ENUM и SET имеют внутреннее числовое -представление, им следует отдавать предпочтение перед другими видами строковых данных, если предоставляется такая возможность.
Производительность можно увеличить за счет представления строк в виде чисел. Примером может служить преобразование IP-адреса из строковой нотации в BIGINT.
Это позволит уменьшить размер таблицы и значительно увеличить скорость при сортировке и выборке данных, но потребует дополнительных преобразований.
Не следует забывать, что базы данных хранятся на жестком диске, и чем меньше места они занимают, тем быстрее происходит поиск и извлечение. Поэтому, там где есть возможность, предпочтение следует отдавать типам данных, занимающих меньше места.
Типы фиксированной длины обрабатываются быстрее типов переменной длины, т.к. в последнем случае при частых удалениях и модификациях таблицы происходит ее фрагментация.