Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
165
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

Глава Типы столбцов и индексов

Перечисления и множества

К строковым типам относятся также перечисления и множества (табл. 11.5). Ячейка типа (перечисление) в определенный момент времени содержит лишь одно значение из списка возможных. Ячейка типа SET (множество) может содержать несколько уникальных значений из числатех, что входят в множество.

Тип

Максимальное число значений

 

65535

SET

64

заносимое в ячейку типа ENUM, указывается в строковом виде. Значение ячейки типа SET записывается в виде строки, содержащей разделенные запятыми элементы множества. Это подразумевает, что сами элементы не содержат запятых.

Влистинге демонстрируется создание таблицы со столбцами типа ENUM и SET,

атакже вставка значений в эти столбцы. Строки, которые не указаны в определении перечисления или множества, игнорируются, за исключением пустых строк.

mysql> CREATE TABLE

SET

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO testenum VALUES Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO testenum VALUES (2, Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM testenum;

Если в качестве значения перечисления указано число, оно считается индексом элемента в определении перечисления. Нумерация элементов начинается с единицы. Ячейки типа SET интерпретируются как битовые поля. Первому элементу множества соответствует младший значащий бит.

Значения даты/времени

Значения даты/времени

В MySQL поддерживаются пять типов хранящих информацию о да те/времени (табл. 11.6). Чаще всего применяются типы DATETIME и Для всех типов значение 0 является допустимым.

Тип

Диапазон значений

DATE

 

DATETIME

 

TIME

 

TIMESTAMP

 

YEAR

 

Значения даты/времени вполне можно хранить в целочисленных или строковых столбцах, но лишь благодаря специальным типам данных появляется возможность эффективно манипулировать этими значениями. Например, поддерживается опера ция сложения дат, что продемонстрировано в листинге Для управления такими столбцами на уровне строк или чисел потребовалось бы писать специальные про граммы. Значения даты/времени могут присутствовать в предложении ORDER BY и их можно сравнивать друг с другом.

mysql> CREATE TABLE

TIMESTAMP,

DATETIME,

DATE, TIME,

у

 

Query OK, 0 rows affected

(0 . 00 sec)

INSERT INTO testtime (dt, d, t,

VALUES

19970322,

Query OK, 1 row affected (0.01 sec)

SELECT * FROM \G

1.row

20010418111943

1989 10 17 17:04:13

1997 03 22

10:15:00

95

1 row in set (0.01 sec)

Глава

Типы столбцов и индексов

UPDATE

 

 

SET

у

 

 

INTERVAL 15 MONTH;

Query OK, 1 row affected

sec)

Rows matched:

1 Changed: 1

1

SELECT * FROM testtime \G

 

 

row

20010418111957

 

dt: 1991 01 17 17:04:13

 

1997 03 22

 

 

10:15:00

 

 

01

 

 

1 row in set

(0 . 00 sec)

 

Значения данного типа являются составными, представляющими собой набор це лочисленных значений. У каждого компонента свой диапазон. Например, номер ме сяца должен находиться в интервале от 1 до 12, номер дня — от 1 до 31,номер часа — от 0 до 23, а число минут и секунд может меняться от 0 до 59.

MySQL не проверяет осмысленность таких дат, как, например, 31 февраля. Разра ботчики MySQL справедливо полагают, что подобные проверки должны осуществлять ся не в СУБД, а в прикладных программах. Допускаются неполные даты наподобие 1970

Это

что дата относится к 1970 году, но месяц и день неизвестны.

Форматы, указанные в табл.

используются при выводе значений на экран.

Вводимые данные могут быть представлены по другому, в строковом или числовом виде. Предполагается, что дата записывается как набор целых чисел в следующем по рядке: год, месяц, день, час, минуты, секунды. Номер года может состоять из двух или четырех цифр. Поля года, месяца и дня являются обязательными. Отсутствующие по ля времени заполняются нулями.

Значение даты, записанное в числовом виде, представляет собой цепочку цифр. Дробная часть числа отбрасывается. В строковом представлении компоненты разде ляются знаками пунктуации. Это может быть любой печатный символ кроме буквы и числа. Между номером дня и часа может стоять пробел, но между всеми остальными компонентами пробелы недопустимы. Неправильные даты обнуляются. К

номерам года в диапазоне

добавляется значение 2000, а к номерам в

диапазоне

добавляется 1900.

 

Спецификация типов

DATE и TIME не поддерживает понятия размер

ности. Значения этих типов всегда содержат определенное количество информации. Столбцы типа YEAR могут иметь размерность 2 или 4.

Столбцы типа TIMESTAMP по умолчанию имеют размерность 14. Допускаются так же размерности 12, 8 и 6. Нечетное число преобразуется в ближайшее большее чет ное. Размерность определяет, какая часть спецификации даты/времени должна ото бражаться в результатах запроса. Реальные значения столбца всегда хранят полную спецификацию. Необычный диапазон значений столбца объясняется тем, что в UNIX время измеряется ввиде количества секунд, прошедших с начала так на

зываемой эпохи (1 января

Это значение хранится в виде четырехбайтового

целого числа.

 

Альтернативные типы данных

В самую первую ячейку типа STAMP автоматически записывается текущее время при изменении других ячеек строки. Данная особенность была продемонстри рована в листинге Чтобы этого избежать, нужно явно занести в ячейку какое то значение.

Альтернативные типы данных

В MySQL поддерживается несколько альтернативных названий базовых типов данных (табл. 11.7). Благодаря им упрощается перенос баз данных из других СУБД в MySQL.

Тип в MySQL

CHAR.( число) BINARY

CHAR

FLOAT

DOUBLE

INT1

INT2

INT3

INT4

INT

INT8

LONG

LONG

MEDIUMINT

BINARY

Индексы

это внутренние механизмы, предназначенные для ускорения поиска строк. Они всегда связаны со списком столбцов какой либо таблицы. Создать индекс можно при определении таблицы или позднее с помощью инструкции ALTER TABLE. То же самое делает инструкция CREATE INDEX, поддерживаемая другими СУБД. Син таксис создания индексов будет описан в главе 13, "Инструкции SQL". В табл. 11.8

типы индексов, поддерживаемые в MySQL.

Глава Типы столбцов и индексов

Тип

Описание

 

Обычный индекс

 

накладывающий на столбец ограничение уникальности

PRIMARY KEY

Индекс, используемый для идентификации записей

FULLTEXT

Индекс, используемый для поиска больших дв оичных объектов

Индексы используются при выполнении операций объединения. Обычный индекс может быть создан для любого столбца, даже такого, в котором есть повторяющиеся или пустые значения.

Индекс типа UNIQUE содержит как указатели, так и ограничения на значения столб ца. Он определяет ключ кандидат, описанный в главе 5, "Реляционная модель". Каждое значение такого индекса уникальным образом идентифицирует строку таблицы.

Первичный ключ — это уникальный индекс, выбранный для идентификации запи сей. У таблицы может быть многоуникальных индексов и лишь один первичный ключ.

В случае строковых столбцов можно создать индекс по нескольким первым симво лам. Иногда это при водит к существенному ускорению поиска. Столбцы типа BLOB или TEXTдопускают лишь такой способ индексации. Максимальная размерность ин декса при этом составляет 1024 символа.

Индекс типа FULLTEXT применяется дляпоиска слов в больших двоичных объек тах. Этот индекс содержит показатели релевантности поиска, наход ящиеся в диапа зоне от 0,0 до 1,0. Все слова в индексируемом тексте разделяются пробелами. Количе ство появлений слова в тексте определяет вес этого слова, причем слова, встречаю щиеся чаще, имеют более низкую релевантность. Слова, состоящие не более чем из трех символов, а также слова, встречающиеся в более чем половине строк, отбрасы ваются и считаются нерелевантными.

Индексы типа FULLTEXT предназначены для относительно крупных столбцов. Ве роятно, их применение не даст полезных результатов, если индексом охвачено менее слов.

В MySQL версии 4.1 флаг UNIQUE будет задавать режим, в котором на столбец на кладывается ограничение уникальности, но индекс не строится. Будет также улучше напроизводительностьиндексовтипаFULLTEXT.

ВСТРОЕННЫЕ

ФУНКЦИИ

этой

Отладка и конфигурирование Управляющие функции Статистические функции Математические функции Строки

Функции работы с датой и временем Прочие функции Процедуры

ункции — это подпрограммы, возвращающие значения, иногда основываясь на значениях входных параметров. Функции можно использовать везде, где раз решены выражения, в том числевместо параметров самих функций. Другими

словами, допускаются вложенные вызовы функций.

Большинство функций принимает параметры в круглых скобках, причем между именем функции и открывающей скобкой не должно быть пробелов. Это помогает программе MySQL отличать имена функций от имен столбцов. Подобное поведение программы можно отменить с помощью аргументов командной строки, но тогда нельзя будет использовать функции в списке возвращаемых столбцов.

Некоторые функции правильнее было бы назвать операторами. Я решил помес тить их здесь, поскольку их работа во многом напоминает работу функций. Круглые скобки им, естественно, не требуются.

Описание каждой функции начинается с заголовка, где указан формат ее вызова. Слова, набранные прописными буквами, являются зарезервированными. Строчными буквами даны параметры, которые могут быть литералами, именами столбцов или выражениями. MySQL распознает имена функций, записанные произвольной комби нацией прописных и строчных букв.

означает, что функция принимает список значений, разделенных запятыми. Все аргументы, находящиеся в квадратных скобках, явл яются необязатель ными. У некоторых функций есть несколько уровней необязательных параметров.

Не забывайте о том, что результатом большинства выражений, в которых участвует значение NULL, будет тоже NULL. Это справедливо и в отношении вызовов функций. Например, конкатенация значения NULL и произвольной строки даст в итоге NULL.

Глава Встроенные функции

Отладка и конфигурирование

Описанные ниже функции возвращают информацию о сервере либо помогают при отладке.

значение)

Функция BENCHMARK вычисляет требуемое выражение столько раз, сколько ука зано в первом аргументе. Она всегда возвращает нуль, но если используется клиент то будет также подсчитано время, затраченное на выполнение функции. В листинге 12.1 показано, сколько времени ушло на выполнение 100000 вызовов функции Здесь подразумевается время, прошедшее с момента ввода за проса до момента получения его результатов, а не время использования центрального процессора. Время выполнения функции может существенно замедляться из за за груженности сервера или сети.

CONNECTION_ID()

Эта функция возвращает идентификатор текущего соединения (листинг 12.2).

— —

I |

I

91 |

1 row in set (0.00 sec)

Эта функция возвращает имя стандартной базы данных (листинг 12.3). Если тако вая не выбрана, возвращается NULL.

Отладка и конфигурирование

Для каждого соединения программа MySQL хранит последнее значение счетчика, служащего первичным ключом. Функция возвращает это значе ние (листинг 12.4). Если функции передать аргумент, она установит его в качестве но вого значения счетчика.

INSERT INTO item VALUES (NULL, 3.75,

Query OK, 1 row affected (0.06 sec)

mysql> SELECT

Существуют два основных применения функции LAST_INSERT_ID Чаще всего она используется со столбцами типа Если вследствие какого либо запроса значение данного столбца увеличивается автоматически, то это значение за поминается и впоследствии возвращается функцией Если же значение столбца задается вручную, то на функции это никак не отражается. В лис тинге 12.4 первый аргумент предложения VALUES инструкции INSERT равен NULL, что приводит к автоматическому увеличению счетчика.

С другой стороны, с помощью функции можно имитировать последовательные счетчики, связав ее с таблицей, состоящей из одного столбца. Об этом подробно рассказывалось в главе 9, "Транзакции и параллельные вычисления".