столбцов с типом NATIONAL VARCHAR используется кодировка UTF-8, в то время как для столбцов с типом VARCHAR можно указать любую кодировку, поддерживаемую MySQL.
• BINARY(<Количество байтов>)
Байтовая (бинарная) строка фиксированной длины. Этот тип аналогичен типу CHAR, только строка содержит не символы, а байты, и значение меньшей длины дополняется справа не пробелами, а нулевыми байтами.
• VARBINARY(<Максимальное количество байтов>)
Байтовая (бинарная) строка переменной длины. Этот тип аналогичен типу VARCHAR, только строка содержит не символы, а байты.
• TINYBLOB
Байтовая (бинарная) строка переменной длины. Максимальная длина – 255 байтов.
• TINYTEXT
Символьная строка переменной длины. Максимальная длина – 255 байтов (не символов!).
Примечание
Обратите внимание, что для типов данных TINYTEXT, TEXT, MEDIUMTEXT или LONGTEXT длина значения ограничена максимальным количеством байтов, а не символов. Для однобайтовых кодировок (таких как KOI8-R, CP-866 или CP-1251) длина значения в байтах и в символах одинакова. Однако для многобайтовых кодировок реальное количество символов в значении может быть меньше, чем количество байтов. Так, в кодировке UTF-8 для кодирования символов английского алфавита используется 1 байт на символ, для русского алфавита – 2 байта на символ, поэтому максимальное количество символов русского алфавита, которое можно ввести в такой столбец, приблизительно в два раза меньше, чем максимальное допустимое количество байтов для этого столбца.
• BLOB [(<Максимальное количество байтов>)].
Байтовая (бинарная) строка переменной длины. Если количество байтов не указано, то значение столбца ограничено 65 535 байтами. Если количество байтов указано, то создается столбец с типом данных TINYBLOB, BLOB, MEDIUMBLOB или LONGBLOB: выбирается тип данных с наименьшим размером, достаточным для хранения этого количества байтов.
• TEXT [(<Максимальное количество символов>)].
Символьная строка переменной длины. Если количество символов не указано, то значение столбца ограничено 65 535 байтами. Если количество символов указано, то создается столбец с типом данных TINYTEXT, TEXT, MEDIUMTEXT или LONGTEXT: выбирается тип данных с наименьшим размером, достаточным для хранения этого количества символов.
• MEDIUMBLOB.
Байтовая (бинарная) строка переменной длины. Максимальная длина – 16 777 215 байтов.
• MEDIUMTEXT.
Символьная строка переменной длины. Максимальная длина – 16 777 215 байтов.
• LONGBLOB.
Байтовая (бинарная) строка переменной длины. Максимальная длина – не более 4 294 967 295 байтов (4 Гбайт), в зависимости от используемого протокола взаимодействия с сервером MySQL и доступных системных ресурсов.
• LONGTEXT.
Символьная строка переменной длины. Максимальная длина – не более 4 294 967 295 байтов (4 Гбайт), в зависимости от используемого протокола взаимодействия с сервером MySQL и доступных системных ресурсов.
• ENUM('<Значение 1>', '<Значение 2>',…).
Строка, содержащая ровно один элемент из заданного списка. Например, если столбец определен как ENUM('a','b'), то допустимыми значениями этого столбца являются значения a, b и NULL (а также пустая строка «», которая может появиться при попытке вставки некорректного значения в данный столбец; о добавлении строк в таблицу и о возможных вариантах обработки некорректных значений пойдет речь в подразделе «Вставка отдельных строк»). В список вы можете включить до 65 535 элементов.
• SET('<Значение 1>', '<Значение 2>',…).
Строка, содержащая любой набор элементов из заданного списка (в том числе пустой). Например, если столбец определен как SET('a','b'), то он может содержать значения «» (пустая строка), a, b, a,b и NULL. В список вы можете включить до 64 элементов. Элементы списка не должны содержать запятых. Каждый из элементов может присутствовать в значении столбца только один раз, причем элементы могут следовать только в том порядке, в котором они перечислены в списке. Например, при вставке значений a,b,a,b и b,a они автоматически преобразуются в значение a,b.
В заключение отметим, что в MySQL вы можете указать кодировку отдельно для каждого символьного столбца. А именно, для столбцов с типом CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, ENUM и SET вы можете задать свойство CHARACTER SET <Имя кодировки> и/или COLLATE <Имя правила сравнения> (подробнее о кодировках и правилах сравнения символьных значений говорилось в разделе «Создание базы данных»).
Например, чтобы имена клиентов хранились в кодировке CP-1251, тогда как кодировкой по умолчанию для таблицы Customers (Клиенты) является UTF-8, столбец name (имя) можно определить следующим образом:
Если кодировка для столбца не задана, то используется кодировка, заданная для таблицы в целом (об этом вы узнаете из подраздела «Другие команды для работы с таблицами»). Если не задана кодировка и для таблицы, то используется кодировка, установленная для базы данных (см. раздел «Создание базы данных»). Наконец, если и для базы данных не была указана кодировка, то используется кодировка, установленная по умолчанию при настройке MySQL.
Итак, мы рассмотрели типы данных, которые вы можете назначать столбцам таблицы, а также свойства, специфичные для отдельных типов столбцов: свойства UNSIGNED, ZEROFILL и AUTO_INCREMENT для числовых столбцов и свойства CHARACTER SET и COLLATE – для символьных. Перейдем теперь к свойствам, используемым независимо от типа столбцов.
Свойства столбцов
При создании или изменении таблицы вы можете указать следующие свойства столбцов.
• NOT NULL.
Это свойство указывает, что в данном столбце не допускаются неопределенные значения (NULL).
В качестве примера рассмотрим столбец product_id (товар) таблицы Orders (Заказы) (см. листинг 2.4), который мы определили какТем самым мы запретили неопределенные номера товаров, поскольку регистрировать заказ с неизвестным товаром не имеет смысла.
Если для столбца задано свойство NOT NULL, то, в частности, NULL не может использоваться в качестве значения по умолчанию для этого столбца. Значение по умолчанию, отличное от NULL, вы можете задать с помощью свойства DEFAULT <Значение>, которое описано ниже. Если же вы задали для столбца свойство NOT NULL, но не задали значение по умолчанию и не указали значение для этого столбца при вставке строки в таблицу, то поведение программы MySQL зависит от того, в каком режиме вы работаете (об этом будет подробно рассказано в подразделе «Вставка отдельных строк»).
• NULL.
Данное свойство указывает, что в столбце разрешены неопределенные значения (NULL). Задавать это свойство имеет смысл только для столбцов с типом TIMESTAMP, которые по умолчанию не допускают неопределенных значений. Остальные типы столбцов допускают неопределенные значения, если только для них не задано свойство NOT NULL.
• DEFAULT <Значение>.
Данное свойство определяет значение по умолчанию для столбца, которое используется, если при вставке строки в таблицу значение столбца не задано явно. Значением по умолчанию может быть только константа; исключение составляют столбцы с типом TIMESTAMP, для которых в качестве значения по умолчанию можно задать переменную величину CURRENT_TIMESTAMP (текущую дату и время). Нельзя установить значение по умолчанию для столбцов с типом TINYBLOB, TINYTEXT, BLOB, TEXT, MEDIUMBLOB, MEDIUM-TEXT, LONGBLOB и LONGTEXT, а также для числовых столбцов, для которых задано свойство AUTO_INCREMENT. Кроме того, нельзя использовать неопределенное значение по умолчанию (NULL), если для столбца задано свойство NOT NULL.
Например, чтобы задать для поля phone (телефон) таблицы Customers (Клиенты) значение по умолчанию, равное пустой строке, можно определить это поле следующим образом:• COMMENT 'Текст комментария'. Произвольное текстовое описание столбца длиной до 255 символов. Например, описание для поля rating (рейтинг) таблицы Customers (Клиенты) можно задать следующим образом:
Помимо перечисленных свойств, для столбца можно также задать свойства UNIQUE и PRIMARY KEY, однако соответствующие настройки ключевых столбцов и индексов можно указать и после определения всех столбцов таблицы. Мы будем рассматривать только второй вариант создания ключевых столбцов и индексов. Об этом и пойдет речь в следующем пункте. Ключевые столбцы и индексы
После того как определены все столбцы таблицы, можно перечислить через запятую ключевые столбцы и индексы (см. листинги 2.1–2.4). Вы можете использовать следующие конструкции:
• [CONSTRAINT <Имя ключа>] PRIMARY KEY (<Список столбцов>).
Определяет первичный ключ таблицы (о первичных ключах было рассказано в главе 1). В таблице может быть только один первичный ключ,