Методичка: Разработка Web-приложений

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Этот тип данных очень удобен, поскольку позволяет MySQL планировать размер базы данных и эффективнее осуществлять просмотр и поиск данных. Но есть у него и недостаток: если присвоить строковое значение длиннее позволенного, оно будет усечено до максимальной длины, объявленной в определении таблицы.

Но у поля year (год) более предсказуемые значения, поэтому вместо VARCHAR для него используется более подходящий тип данных -- CHAR(4). Параметр 4 позволяет выделить под него 4 байта данных, поддерживающих все года от ?999 и до 9999; байт содержит 8 бит и может иметь значения от 00000000 до 11111111, что в десятичном представлении означает от 0 до 255.

Можно было бы, конечно, сохранять год и в значении, состоящем из двух цифр, но если данные не утратят своей актуальности и в следующем столетии или показатель лет каким-то образом опять вернется к нулевому значению, то эту проблему нужно решать в первоочередном порядке, поскольку она очень похожа на «проблему 2000 года», из-за которой даты начиная с 1 января 2000 года во многих крупных компьютерных системах могли быть отнесены к 1900 году.

Оба типа данных (и CHAR, и VARCHAR) принимают строки текста, ограничивая их длину размером поля. Разница между ними состоит в том, что каждая строка в поле CHAR имеет указанный размер. Если поместить в него строку меньшего размера, она будет дополнена пробелами. В поле VARCHAR дополнения текста не происходит; его размер может изменяться таким образом, чтобы в него помещался вставленный текст. Но при использовании поля VARCHAR требуется идти на небольшие издержки, чтобы отслеживать размер каждого значения. Поэтому CHAR больше подходит для тех случаев, когда данные во всех записях имеют одинаковый размер, а VARCHAR эффективнее применять, когда размеры могут сильно отличаться друг от друга и возрастать. Но за это приходится расплачиваться тем, что доступ к данным типа VARCHAR осуществляется несколько медленнее, чем к данным типа CHAR.

Тип данных CHAR

В табл. 6 перечислены все типы символьных данных CHAR. Все они предлагают указать параметр, устанавливающий максимальную (или точную) длину строки, которая может быть помещена в поле. Из таблицы следует, что у каждого типа есть присущее ему максимальное значение длины. Для данных типа VARCHAR длиной от 0 до 255 байт требуется еще один байт в хранилище, а для данных длиной более 256 байт требуется еще два байта.

Таблица 6. Типы данных CHAR, используемые в MySQL

Тип данных

Количество байт

Примеры

CHAR(n)

В точности равное n (< 256)

CHAR(5) Hello использует 5 байт

CHAR(57) Goodbye использует 57 байт

VARCHAR(n)

Вплоть до n (< 65 536)

VARCHAR(7) Morning использует 7 байт

VARCHAR(100) Night использует 5 байт

Тип данных BINARY

Тип данных BINARY применяется для хранения строк, заполненных байтами, не имеющими никакой связи с таблицей символов (табл. 7). Например, тип данных BINARY можно использовать для хранения изображения в формате GIF.

Таблица 7. Типы данных BINARY, используемые в MySQL

Тип данных

Количество байт

Примеры

BINARY(n) или BYTE(n)

В точности равное n (< 256)

Похож на CHAR, но содержит двоичные данные

VARBINARY(n)

Вплоть до n (? 65 536)

Похож на VARCHAR, но содержит двоичные данные

Типы данных TEXT и VARCHAR

Типы данных TEXT и VARCHAR имеют незначительные отличия друг от друга.

Ѓ До выхода версии 5.0.3 MySQL удалял из полей VARCHAR все начальные и замыкающие пробелы.

Ѓ В полях типа TEXT не может быть исходных значений.

Ѓ В столбце TEXT MySQL индексирует только первые n символов (n задается при создании индекса).

Это означает, что VARCHAR является более приемлемым и быстрее обрабатываемым типом данных, если нужно вести поиск по всему содержимому поля. Если поиск никогда не будет вестись более чем в конкретном количестве начальных символов хранящегося в поле значения, то, наверное, нужно остановить свой выбор на типе данных TEXT (табл. 8).

Таблица 8. Типы данных TEXT, используемые в MySQL

Тип данных

Количество байт

Особенности

TINYTEXT(n)

Вплоть до n (< 256)

Считается строкой с набором символов

TEXT(n)

Вплоть до n (< 65 536)

Считается строкой с набором символов

MEDIUMTEXT(n)

Вплоть до n (< 1,67e+7)

Считается строкой с набором символов

LONGTEXT(n)

Вплоть до n (< 4,29e+9)

Считается строкой с набором символов

Тип данных BLOB

Термин BLOB означает Binary Large Object -- большой двоичный объект, и поэтому, как и можно было предположить, тип данных BLOB больше всего подходит для хранения двоичных данных, превышающих по объему 65 536 байт. Другим основным отличием BLOB от типа данных BINARY является то, что для столбцов типа BLOB нельзя задавать исходные значения (табл. 9).

Таблица 9. Типы данных BLOB, используемые в MySQL

Тип данных

Количество байт

Особенности

TINYBLOB(n)

Вплоть до n (< 256)

Считается не набором символов, а двоичными данными

BLOB(n)

Вплоть до n (< 65 536)

Считается не набором символов, а двоичными данными

MEDIUMBLOB(n)

Вплоть до n (1,67e+7)

Считается не набором символов, а двоичными данными

LONGBLOB(n)

Вплоть до n < 4,29e+9)

Считается не набором символов, а двоичными данными

Числовые типы данных

В MySQL поддерживаются различные числовые типы данных -- от одиночного байта до чисел с плавающей точкой с удвоенной точностью. Хотя для числового поля можно использовать до 8 байт, лучше все же выбрать поле с самым скромным типом данных, в котором способно уместиться наибольшее из ожидаемых вами значений.

Тогда ваша база данных будет небольшой по объему и быстрой по доступу.

В табл. 10 перечислены числовые типы данных, поддерживаемые MySQL, и диапазоны значений, которые могут содержаться в их полях. Если вы не знакомы с терминологией, поясню, что число со знаком имеет диапазон возможных значений от отрицательного до нуля и от нуля до положительного значения, а число без знака может быть в диапазоне от нуля до положительного значения. Оба они могут иметь одинаковую величину, нужно лишь представить число со знаком, сдвинутым наполовину влево, с одной половиной в отрицательном, а с другой -- в положительном диапазоне. Следует заметить, что значения с плавающей точкой (любой точности) могут быть только числами со знаком.

Таблица 10. Числовые типы данных, используемые в MySQL

Тип данных

Количество байт

Минимальное значение

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

Со знаком

Без знака

Со знаком

Без знака

TINYINT

1

-128

0

127

255

SMALLINT

2

-32 768

0

32 767

65 535

MEDIUMINT

3

-8,38e+6

0

8,38e+6

1 ,67e +7

INT или INTEGER

4

?2,15e+9

0

2,15e+9

4 ,29e +9

BIGINT

8

?9,22e+18

0

9,22e+18

1 , 84e+19

FLOAT

4

?3,40e+38

Не бывает

3,40e+38

Не бывает

DOUBLE или REAL

8

?1,80e+308

Не бывает

1,80e+308

Не бывает

Чтобы указать, какой именно тип данных используется, со знаком или без знака, применяется спецификатор UNSIGNED. В следующем примере создается таблица по имени tablename, содержащая поле fieldname с типом данных UNSIGNED INTEGER:

CREATE TABLE tablename (fieldname INT UNSIGNED);

При создании числового поля можно также передать в качестве параметра необязательное число:

CREATE TABLE tablename (fieldname INT(4));

Но при этом следует помнить, что, в отличие от типов данных BINARY и CHAR, этот параметр не показывает количество байтов, выделяемых под хранение.

Может быть, это противоречит интуитивному восприятию, но на самом деле это число обозначает отображаемую ширину данных в поле при его извлечении. Оно часто используется вместе со спецификатором ZEROFILL:

CREATE TABLE tablename (fieldname INT(4) ZEROFILL);

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

Если поле уже занимает четыре и более символа, дополнение не производится.

Типы данных DATE и TIME

В табл. 11 показана еще одна важная категория типов данных, поддерживаемая MySQL, которая относится к дате и времени.

Таблица 11. Типы данных DATE и TIME, используемые в MySQL

Тип данных

Формат времени-даты

DATETIME

'0000-00-00 00:00:00'

DATE

'0000-00-00'

TIMESTAMP

'0000-00-00 00:00:00'

TIME

'00:00:00'

YEAR

0000 ( только годы 0000 и 1901-2155)

Значения, имеющие типы данных DATETIME и TIMESTAMP, отображаются одинаково. Основное различие в том, что у TIMESTAMP слишком узкий диапазон (от 1970 до 2037 года), а в DATETIME может храниться практически любая нужная дата, если только вы не интересуетесь античной историей или научной фантастикой.

Но TIMESTAMP также полезен, потому что, используя его, можно позволить MySQL установить для вас нужное значение. Если при добавлении строки не задавать значение для поля с этим типом данных, то в него автоматически будет вставлено текущее время. Можно также заставить MySQL обновлять столбец с типом данных TIMESTAMP при каждом изменении строки.

Добавление данных к таблице

Для добавления данных к таблице предназначена команда INSERT. Рассмотрим ее в действии, заполнив таблицу classics данными из табл. 1, многократно используя одну и ту же форму команды INSERT (пример 8).

Пример 8. Заполнение таблицы classics

INSERT INTO classics(author, title, type, year)

VALUES('Mark Twain','The Adventures of Tom Sawyer','Fiction','1876');

INSERT INTO classics(author, title, type, year)

VALUES('Jane Austen','Pride and Prejudice','Fiction','1811');

INSERT INTO classics(author, title, type, year)

VALUES('Charles Darwin','The Origin of Species','Non-Fiction','1856');

INSERT INTO classics(author, title, type, year)

VALUES('Charles Dickens','The Old Curiosity Shop','Fiction','1841');

INSERT INTO classics(author, title, type, year)

VALUES('William Shakespeare','Romeo and Juliet','Play','1594');

После каждой второй строки вы должны увидеть сообщение об успешной обработке запроса -- Query OK. Как только будут введены все строки, наберите следующую команду, которая отобразит содержимое таблицы:

SELECT * FROM classics;

Результат должен быть похож на тот, что показан на рис. 4.

Рис. 4. Заполнение таблицы classics и просмотр ее содержимого

Сейчас не стоит обращать внимания на команду SELECT, ее очередь наступит в разделе «Запросы к базе данных MySQL с помощью PHP». Достаточно сказать, что в таком виде она отображает все только что введенные данные.

Теперь вернемся назад и посмотрим, как используется команда INSERT. Ее первая часть, INSERT INTO classics, сообщает MySQL, куда нужно вставлять следующие за ней данные. Затем в круглых скобках перечисляются четыре имени столбцов: author, title, type и year, которые отделяются друг от друга запятыми.

Таким образом MySQL сообщается, что именно в эти четыре поля будут вставляться данные.

Во второй строке каждой команды INSERT содержится ключевое слово VALUES, за которым следуют четыре строковых значения, взятых в кавычки и отделенных друг от друга запятыми. Они обеспечивают MySQL теми четырьмя значениями, которые будут вставлены в четыре ранее указанных столбца. (Как и во всех остальных примерах, разбиение команды на строки было моим собственным решением, придерживаться которого не обязательно.)

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

Переименование таблиц

Переименование таблиц, как и любые другие изменения ее структуры или метаданных, осуществляются посредством команды ALTER. Поэтому, чтобы, к примеру, изменить имя таблицы classics на pre1900, воспользуйтесь следующей командой:

ALTER TABLE classics RENAME pre1900;

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

ALTER TABLE pre1900 RENAME classics;

Изменение типа данных столбца

Для изменения типа данных столбца также используется команда ALTER, но в этом случае вместе с ней применяется ключевое слово MODIFY. Поэтому для изменения типа данных столбца year с CHAR(4) на SMALLINT (для которого потребуется только 2 байта памяти, что способствует экономии дискового пространства) нужно ввести следующую команду: