Анатолий Мотев СанктПетербург бхвпетербург 2006 удк 681 06 ббк 32. 973. 26018. 2 М85
Скачать 4.25 Mb.
|
Тип Требуемая память для хранения значения 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. Те- перь нам необходимо определить типы для каждого поля всех таблиц, имею- щихся в учебной базе "Библиотека". Но прежде следует сказать несколько слов о правилах выбора типа данных для полей, а также об именовании таб- лиц и полей. Âûáîð òèïà äàííûõ äëÿ ïîëÿ Поговорим немного о том, чем нужно руководствоваться при выборе типа поля. При создании баз данных наиболее часто используются строковые по- ля, которые хранят любые значения. Может возникнуть вопрос — а почему бы не сделать все поля строковыми? Можно поступить и так, но это создаст довольно много проблем. Во-первых, при этом неэффективно используется память, во-вторых, числа и строки обрабатываются по-разному. Например, при сортировке или операциях сравнения нам потребуется каждый раз пре- образовывать строковое поле в числовой формат. Все это окажет влияние на общую производительность системы. На первый взгляд, все очевидно: числа хранятся в числовых полях, строки — в строковых, дата и время — в полях календарного типа. Но на самом деле не все так просто, есть множество нюансов, о которых следует помнить. Одно дело, если вы разрабатываете БД для своих нужд, другое — если для заказчи- ка. Во втором случае вы должны узнать довольно точно, в каком виде пред- стоит хранить и выводить значения. Например, если требуется хранить параметры каких-то товаров (ширину, вы- соту и т. д.), то можно это сделать различными способами. Допустим, вы мо- |