Главная страница

Анатолий Мотев СанктПетербург бхвпетербург 2006 удк 681 06 ббк 32. 973. 26018. 2 М85


Скачать 4.25 Mb.
НазваниеАнатолий Мотев СанктПетербург бхвпетербург 2006 удк 681 06 ббк 32. 973. 26018. 2 М85
Дата12.10.2022
Размер4.25 Mb.
Формат файлаpdf
Имя файлаuroki_mysql_samouchitel_3642745.pdf
ТипКнига
#730460
страница5 из 14
1   2   3   4   5   6   7   8   9   ...   14
Тип
Требуемая память для хранения значения
CHAR(length) length байт
VARCHAR(length) length
+ 1 байт
TINYBLOB
, TINYTEXT length + 1 байт (length < 256)
BLOB
, TEXT до 64 Кбайт
MEDIUMBLOB
, MEDIUMTEXT до 16 Мбайт
LONGBLOB
, LONGTEXT до 4 Гбайт
Если данные, вносимые в поля типа
TEXT
или
BLOB
, превышают максимальную допустимую длину, то они будут усечены соответствующим образом.
В принципе, поле типа
TEXT
можно рассматривать как поле типа
VARCHAR
без ограничения длины (аналогично,
BLOB
— как поле типа
VARCHAR BINARY
). Раз- личия при этом следующие:
 в полях с типом
BLOB
и
TEXT
не удаляются концевые пробелы, как это дела- ется для полей типа
VARCHAR
;
 для столбцов
BLOB
и
TEXT
не может быть задан атрибут
DEFAULT
— значения величин по умолчанию;
 поля
BLOB
и
TEXT
могут индексироваться в версии MySQL версии 3.23.2 и более.
Эти типы полей полезны, когда требуется хранить большие объемы данных, например всевозможные электронные документы или изображения.

Óðîê 3. Òèïû äàííûõ è òèïû òàáëèö
41
Äàòà è âðåìÿ
В MySQL поддерживаются следующие типы данных для хранения даты и времени:
YEAR
,
DATE
,
TIME
,
DATETIME
,
TIMESTAMP
. Каждый из этих типов данных имеет интервал допустимых значений. В том случае если пользователь введет в такое поле недопустимое значение, оно будет заменено на '0'
. Например, при попытке ввести в поле
DATE
значение '300'
или 'hallo'
мы получим в ре- зультате '0000-00-00'
. Следует отметить, что MySQL позволяет хранить не- которые не вполне верные значения даты, например '1998-02-31'
. В этом случае проверкой вводимых данных должно заниматься приложение, в кото- ром работает пользователь. MySQL выполняет только минимальную провер- ку вводимых данных. СУБД проверяет, находится ли месяц в интервале
0—12 и день в интервале 0—31. Данные интервалы начинаются с 0 для того, чтобы обеспечить для MySQL возможность хранить в столбцах
DATE
или
DATETIME
даты, в которых день или месяц равен нулю, например,
'1980-00-00' или '1980-01-00'
(это удобно в случае, если в поле вносится дата рождения, но известны лишь год и месяц).
Даты должны задаваться в порядке год-месяц-день (например,
'1980-09-21'
), а не в том порядке, как мы их обычно записываем (например,
'21-09-1980'
).
MySQL поддерживает двузначный ввод года:
 значения в диапазоне от 0 до 69 будут интерпретированы и сохранены как года от 2000 до 2069;
 значения в диапазоне от 70 до 99 будут интерпретированы и сохранены как года от 1970 до 1999.
Òèï YEAR
Тип
YEAR
— это однобайтный тип данных для хранения значения года. Дан- ные можно вводить в формате
YYYY, либо YY. Диапазон значений года — от 1901 до 2155. Все недопустимые значения преобразуются в 0. Если не тре- буется хранить полную дату, то наиболее эффективным будет данный тип
(например, для хранения значения "год рождения" или "год выпуска изде- лия").
Òèï TIME
Тип
TIME
— тип данных для хранения времени. Значение всегда выводится в формате
HH:MM:SS. Ввод данных может быть осуществлен в следующих форматах:

×àñòü I. Ïðîåêòèðîâàíèå áàçû äàííûõ
42

HH:MM:SS;

HHMMSS — строка интерпретируется как дата (например, ввод значения '122210'
будет воспринят как '12:22:10'
); если ввести недопустимую ве- личину (например,
'129801'
), она преобразуется в '00:00:00'
;

HHMM — значение секунд равно нулю;

HH — значения минут и секунд обнуляются.
Величины также можно вводить как число, например, величина '100122'
бу- дет воспринята как '10:01:22'
(формат
HHMMSS). Если величина типа
TIME
представлена как строка с разделителями, то необязательно вводить по два разряда для значений часов, минут и секунд меньше 10. То есть величина '9:5:7'
эквивалентна '09:05:07'
Если значение, вводимое в поле типа TIME, не содержит разделителей, то оно будет воспринято не как время дня, а как истекшее время. Пример: вы вводите величину '1225', подразумевая 12 часов 25 минут дня ('12:25:00'), а MySQL понимает ее как '00:12:25' (12 минут 25 секунд).
Значения в поле
TIME
могут лежать в пределах от '-838:59:59'
до '838:59:59'
Почему же значения часов настолько велики? Дело в том, что тип
TIME
может использоваться не только для хранения времени дня, но и для представления истекшего времени или интервала между какими-нибудь событиями, кото- рый может превышать 24 часа или быть отрицательным.
Значения, лежащие за пределами допустимого интервала, будут соответст- вующим образом усечены. Например, введенные значения '-900:00:00'
и '900:00:00'
будут преобразованы в '-838:59:59'
до '838:59:59'
соответст- венно. Недопустимые значения будут приведены к виду '00:00:00'
Òèïû DATE, DATETIME è TIMESTAMP
Тип данных
DATE
предназначен для хранения значений года, месяца и дня.
Значения всегда выводятся в формате
YYYY-MM-DD. Ввод данных может осуществляться в следующих форматах:

YYYY-MM-DD;

YY-MM-DD;

YYMMDD;

YYMMDDHHMMSS (часть, хранящая время, игнорируется).
Для значений, представленных как строки и содержащих разделительные знаки между частями даты, необязательно указывать два разряда для значе- ний месяца или дня меньше 10. Так, величина '1980-5-9'
эквивалентна вели-

Óðîê 3. Òèïû äàííûõ è òèïû òàáëèö
43 чине '1980-05-09'
. Данный тип поддерживает диапазон от '1000-01-01'
до '9999-12-31'
. Недопустимое значение преобразуется к виду '0000-00-00'
При задании значения даты следует учитывать некоторые особенности
MySQL.

Упрощенный формат, который допускается для значений, заданных стро- ками, может ввести в заблуждение. Например, такое значение, как '10:11:12'
, благодаря разделителю ':'
могло бы оказаться значением вре- мени, но, используемое в контексте даты, оно будет интерпретировано как год '2010-11-12'
. В то же время величина '12:55:35'
будет преобразована в '0000-00-00'
, т. к. значение '55'
является недопустимым значением для месяца.

MySQL выполняет только начальную проверку подлинности даты: дни
00—31, месяцы 00—12, года 1000—9999. Любая дата вне этого диапазона преобразуется в '0000-00-00'
. Следует также отметить, что хранить невер- ные даты, такие как '2004-02-31'
, не запрещается. Чтобы убедиться в дос- товерности даты, необходимо выполнять проверку в приложении, с кото- рым работает пользователь.

Значения года, представленные двумя разрядами, допускают неоднознач- ное толкование, т. к. неизвестно столетие. MySQL интерпретирует двух- разрядные значения года по следующим правилам:
• значения года в интервале 00—69 преобразуются в 2000—2069;
• значения года в интервале 70—99 преобразуются в 1970—1999.
Тип данных
DATETIME
используется для полей, хранящих информацию как о дате, так и о времени. Вывод значений СУБД MySQL осуществляется в формате
YYYY-MM-DD HH:MM:SS. Для данного типа поддерживается диапа- зон значений от '1000-01-01 00:00:00'
до '9999-12-31 23:59:59'
Тип данных
TIMESTAMP(length) можно использовать для автоматической записи текущих даты и времени при выполнении операций
INSERT
(ввод дан- ных) и
UPDATE
(обновление данных). Дата начинается с 19700101000000
и за- канчивается где-то в далеком 2037 году. Начальное значение — это "начало эпохи" ОС UNIX. При внесении значения
NULL
в поле запишется текущее время для сервера. Также можно внести значение вручную. Необязательный параметр length
(длина) определяет формат вывода значения поля на экран.
Понятие длины довольно условно. Параметр length задает длину отображе- ния (т. е. количество символов для отображения значений столбца). Но если длина отображаемого значения содержит больше символов, чем задано в па- раметре length, то будет отображено все значение, а не его часть, обрезанная до length символов.

×àñòü I. Ïðîåêòèðîâàíèå áàçû äàííûõ
44
Полный формат
TIMESTAMP
составляет 14 десятичных разрядов, но можно соз- давать поля типа
TIMESTAMP
и меньшей длины (табл. 3.5).
Òàáëèöà 3.5. Çàâèñèìîñòü ôîðìàòà âûâîäà îò äëèíû ïîëÿ òèïà TIMESTAMP
Тип поля
Формат
TIMESTAMP(14)
YYYYMMDDHHMMSS
TIMESTAMP(12)
YYMMDDHHMMSS
TIMESTAMP(10)
YYMMDDHHMM
TIMESTAMP(8)
YYYYMMDD
TIMESTAMP(6)
YYMMDD
TIMESTAMP(4)
YYMM
TIMESTAMP(2)
YY
Обычно значение параметра length устанавливают равным 6, 8, 12 или 14.
При создании таблицы вы можете задать произвольную длину поля, но если она окажется равной 0 или превысит 14, то будет использоваться значение 14.
Нечетные значения параметра length будут приведены к ближайшему боль- шему четному числу. Недопустимые значения, внесенные в поле типа
TIMESTAMP
, будут преобразованы в 0. Тип
TIMESTAMP
можно использовать для хранения даты создания или даты последней модификации чего-либо. Если вам нужно хранить и то и другое, соответственно создайте два поля типа
TIMESTAMP
. Но, помните, что в этом случае автоматически будет изменяться только первое из них. Соответственно поле, хранящее дату модификации, должно быть первым, а поле с датой создания — вторым.
Внутренний размер данных, хранящихся в поле
TIMESTAMP
, не зависит от дли- ны выводимого значения и всегда равен 4 байтам (табл. 3.6).
Величину одного типа даты можно в ряде случаев присвоить объекту другого типа даты, но в этом случае возможны некоторые изменения значения или потеря информации:
 если присвоить значение типа
DATE
объекту типа
DATETIME
или
TIMESTAMP
, то в результирующем значении временна´я часть будет установлена в '00:00:00'
, т. к. значение типа
DATE
не содержит информации о времени;
 если присвоить значение типа
DATETIME
или
TIMESTAMP
объекту типа
DATE
, то временна´я часть в результирующем значении будет удалена, т. к. тип
DATE
не включает информацию о времени.

Óðîê 3. Òèïû äàííûõ è òèïû òàáëèö
45
Òàáëèöà 3.6. Òðåáîâàíèÿ ê ïàìÿòè äëÿ òèïîâ äàòû è âðåìåíè
Тип
Число байт, необходимых для хранения значения
YEAR
1 байт
DATE
3 байта
TIME
3 байта
DATETIME
8 байт
TIMESTAMP
4 байта
Ñïèñêè
Имеющиеся в MySQL типы списков:
ENUM
(перечисление),
SET
(множество).
Давайте рассмотрим их более детально.
Òèï ENUM (ïåðå÷èñëåíèå)
Поле типа
ENUM
может содержать одно значение из предварительно заданного набора (например,
ENUM('яблоки', 'бананы', 'апельсины')
). Данные могут быть введены как одно из текстовых значений набора или как число, соответ- ствующее одному из элементов набора (номер первого элемента — 1). Этим значением также может быть пустая строка (
''
) или
NULL
. Для этого должны быть выполнены следующие условия.

Если вводится некорректное значение в поле типа
ENUM
(т. е. строка, не присутствующая в списке допустимых), то вставляется пустая строка (это указывает на ошибочное значение). Данная строка отличается от "обыч- ной" пустой строки в том, что она имеет цифровое значение, равное 0.

Если значение в поле типа
ENUM
определяется как
NULL
, то
NULL
является допустимым значением такого поля, а также значением по умолчанию.
Если значение в поле типа
ENUM
определяется как
NOT NULL
, то значением по умолчанию является первый элемент из списка допустимых значений.
Набор может содержать до 65 535 различных элементов. Если в наборе меньше 256 элементов, поле займет один байт, иначе его размер будет равен двум байтам (см. табл. 3.8).
Каждое из допустимых значений имеет индекс.

Значения из списка допустимых величин, определенных при создании таблицы, индексируются, начиная с 1.

Индексом пустой строки является 0.

Индексом значения
NULL
является
NULL

×àñòü I. Ïðîåêòèðîâàíèå áàçû äàííûõ
46
Начиная с MySQL версии 3.23.51 при создании таблицы из значений этого поля автоматически удаляются оконечные пробелы.
Регистр букв не играет роли, когда вы делаете вставку в поле типа
ENUM
. Од- нако регистр букв в значениях, получаемых из этого столбца, совпадает с ре- гистром букв в соответствующем значении, заданном во время создания таб- лицы.
Если вы вставляете число в поле типа
ENUM
, то это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение из перечисления.
В поле типа ENUM не рекомендуется сохранять числа, т. к. это может привести к излишней путанице.
Значения перечисления сортируются в соответствии с их индексами. Напри- мер, для
ENUM('яблоки', 'бананы')
значение "яблоки" в отсортированном вы- воде будет упомянуто раньше, чем значение "бананы", а для
ENUM('бананы',
'яблоки')
значение "бананы" появится раньше значения "яблоки."
Пустые строки возвращаются перед непустыми строками, а значения
NULL
выводятся в самую первую очередь.
Òèï SET (ìíîæåñòâî)
Поле типа
SET может содержать любое количество предварительно заданных значений. Данные могут быть заданы как список разделенных запятыми зна- чений (например,
SET('синий', 'зеленый', 'красный', 'желтый')
). Как след- ствие, сами элементы множества не могут содержать запятых.
Например, столбец, определенный как
SET('один', 'два')
NOT NULL
, может принимать такие значения:

''

'один'

'два'

'один,два'
В одном наборе
SET
может быть до 64 различных элементов.
Начиная с MySQL версии 3.23.51 при создании таблицы из значений множе- ства
SET
автоматически удаляются концевые пробелы.
MySQL сохраняет значения
SET
в численном виде, где младший бит сохра- ненной величины соответствует первому элементу множества. Если вы де- лаете выборку столбца
SET
в числовом контексте, полученное значение со-

Óðîê 3. Òèïû äàííûõ è òèïû òàáëèö
47 держит соответствующим образом установленные биты, создающие значение столбца.
Если делается вставка в поле типа
SET
, биты, установленные в двоичном представлении числа, определяют элементы множества. Например, поле было определено как
SET('a', 'b', 'c', 'd')
. Представление элементов поля
SET
(установленные биты) для этого случая приведено в табл. 3.7.
Òàáëèöà 3.7. Ïðåäñòàâëåíèå ýëåìåíòîâ ïîëÿ SET
Элемент
Числовое значение
Двоичное представление a
1 0001 b
2 0010 c
4 0100 d
8 1000
Для значения, содержащего больше одного элемента, не играет никакой роли порядок, в котором эти элементы перечисляются в момент вставки значения.
Также неважно, сколько раз встречается то или иное значение. Когда это зна- чение выбирается, каждый элемент будет присутствовать только единожды, и элементы будут перечислены в том порядке, в котором они перечисляются при создании таблицы.
Например, если поле определено как
SET('a', 'b', 'c', 'd')
, тогда 'a,d'
,
'd,a'
и 'd,a,a,d,d'
будут представлены как 'a,d'
Если вы вставляете в поле
SET
некорректную величину, это значение будет проигнорировано.
Значения в поле
SET
сортируются в соответствии с числовым представлением.
NULL
-значения идут в первую очередь.
Размер объекта
SET
определяется количеством отличающихся элементов множества. Если это количество равно
N, то размер объекта вычисляется по формуле (
N + 7) / 8 и полученное число округляется до 1, 2, 3, 4 или 8 байтов.
В множество
SET
может входить максимум 64 элемента.
Размер объекта
ENUM
определяется количеством различных перечисляемых величин. Один байт используется для перечисления до 255 возможных вели- чин. Используя два байта, можно перечислить до 65 535 величин.
Требования к памяти для типов
ENUM
и
SET приведены в табл. 3.8.

×àñòü I. Ïðîåêòèðîâàíèå áàçû äàííûõ
48
Òàáëèöà 3.8. Òðåáîâàíèÿ ê ïàìÿòè äëÿ òèïîâ ENUM è SET
Тип
Число байт, необходимых для хранения значения
ENUM('значение1', 'значение2', ...)
1 или 2, в зависимости от количества пере- численных значений (максимум 65 535)
SET('значение1', 'значение2', ...)
1, 2, 3, 4 или 8 в зависимости от количества перечисленных элементов множества (мак- симум 64)
ÂÎÏÐÎÑÛ ÄËß ÑÀÌÎÊÎÍÒÐÎËß
1.
Какие четыре базовых текстовых типа поддерживает MySQL?
2.
Сколько памяти требуется для хранения значения типа
SMALLINT
?
3.
Каков диапазон допустимых значений для типа
YEAR
?
Итак, мы рассмотрели все типы данных, поддерживаемые СУБД MySQL. Те- перь нам необходимо определить типы для каждого поля всех таблиц, имею- щихся в учебной базе "Библиотека". Но прежде следует сказать несколько слов о правилах выбора типа данных для полей, а также об именовании таб- лиц и полей.
Âûáîð òèïà äàííûõ äëÿ ïîëÿ
Поговорим немного о том, чем нужно руководствоваться при выборе типа поля. При создании баз данных наиболее часто используются строковые по- ля, которые хранят любые значения. Может возникнуть вопрос — а почему бы не сделать все поля строковыми? Можно поступить и так, но это создаст довольно много проблем. Во-первых, при этом неэффективно используется память, во-вторых, числа и строки обрабатываются по-разному. Например, при сортировке или операциях сравнения нам потребуется каждый раз пре- образовывать строковое поле в числовой формат. Все это окажет влияние на общую производительность системы.
На первый взгляд, все очевидно: числа хранятся в числовых полях, строки — в строковых, дата и время — в полях календарного типа. Но на самом деле не все так просто, есть множество нюансов, о которых следует помнить. Одно дело, если вы разрабатываете БД для своих нужд, другое — если для заказчи- ка. Во втором случае вы должны узнать довольно точно, в каком виде пред- стоит хранить и выводить значения.
Например, если требуется хранить параметры каких-то товаров (ширину, вы- соту и т. д.), то можно это сделать различными способами. Допустим, вы мо-
1   2   3   4   5   6   7   8   9   ...   14


написать администратору сайта