|
code=&Xal 4=flora+springs&Xv4=.
Если создать поле типа CHAR длины, достаточной для хранения этого URL, то почти
для каждого другого хранимого URL будет напрасно тратиться весьма значительное
пространство. Поля переменной длины позволяют задать такую длину, что
оказывается возможным хранение необычно длинных значений, и в то же время не
расходуется напрасно место при хранении обычных коротких величин. В MySQL и
mSQL подход к этой проблеме различный.
Поля переменной длины в MySQL
Если вы используете только mSQL, этот раздел можно пропустить. Преимуществом
текстовых полей переменной длины в MySQL является то, что они используют ровно
столько места, сколько необходимо для хранения отдельной величины. Например,
поле типа VARCHAR(255) , в котором хранится строка «hello, world», занимает
только двенадцать байтов (по одному байту на каждый символ плюс еще один байт
для хранения длины).
В отличие от стандарта ANSI, в MySQL поля типа VARCHAR не дополняются пробелами.
Перед записью из строки удаляются лишние пробелы.
Сохранить строки, длина которых больше, чем заданный размер поля, нельзя. В
поле VARCHAR(4) можно сохранить строку не длиннее 4 символов. Если вы
попытаетесь сохранить строку «happy birthday», MySQL сократит ее до «happ».
Недостатком подхода MySQL к хранению полей переменной длины, в сравнении с mSQL,
является то, что не существует способа сохранить необычную строку, длина
которой превосходит заданное вами значение. В таблице 6-2 показан размер
пространства, необходимого для хранения 144-символьного URL,
продемонстрированного выше, и обычного, 30-символьного URL,
Таблица 6-2. Пространство памяти, необходимое для различных символьных типов
MySQL
Тип данныхПространство для хранения строки из 144 символовПространство для
хранения строки из 30 символовМаксимальная длина строкиСНАR(150)150150255
VARCHAR(ISO)14531255TINYTEXT(ISO)14531255ТЕХТ(150)1463265535MEDIUM-ТЕХТ(150)147
3316777215LONGTEXT(150)148344294967295Если через годы работы со своей базой
данных вы обнаружите, что мир изменился, и поле, уютно чувствовавшее себя в
типе VARCHAR(25) , должно теперь вмещать строки длиной 30 символов, не все
потеряно. В MySQL есть команда ALTER TABLE , позволяющая переопределить размер
поля без потери данных.
ALTER TABLE mytable MODIFY tnycolumn LONGTEXT
Поля переменной длины в mSQL
Если вас интересует только MySQL, этот раздел можно пропустить. Символьные поля
переменной длины в mSQL позволяют задать длину как средний размер строки,
которая будет в нем храниться. Каждая величина, вводимая в это поле, займет, по
крайней мере, столько места, сколько вами задано, но поле может хранить и более
длинные строки. Для этого база данных создает таблицу переполнения, в которой
хранит лишние данные. Недостаток такого подхода проявляется в снижении
производительности и невозможности индексировать поля переменной длины.
Остановимся немного на последствиях различий в подходе. Чтобы сохранить все
вышеперечисленные URL в поле типа CHAR, потребуется колонка типа CHAR(144). При
таком развитии событий четыре упомянутые URL займут 576 байт (144 х 4), хотя
фактически хранится только 216 байт данных. Остальные 360 байт- просто
потерянное пространство. Если помножить эту цифру на тысячи и миллионы строк,
то можно понять, что это представляет собой серьезную проблему. Если же
использовать поле переменной длины типа ТЕХТ(30), то для хранения 216 байт
данных требуется только 234 байта (30 X 3 + 144). Всего лишь 18 байт потеряно.
Экономия составила 41%!
Двоичные типы данных
В mSQL нет поддержки двоичных данных. В MySQL, напротив, есть целый ряд
двоичных типов данных, соответствующих своим символьным аналогам. Двоичными
типами, поддерживаемыми MySQL, являются CHAR BINARY , VARCHAR BINARY , TINYBLOB,
BLOB, MEDIUMBLOB и LONGBLOB. Практическое отличие между символьными типами и
их двоичными аналогами основано на принципе кодировки. Двоичные данные просто
являются куском данных, которые MySQL не пытается интерпретировать. Напротив,
символьные данные предполагаются представляющими текстовые данные из
используемых человеком алфавитов. Поэтому они кодируются и сортируются,
основываясь на правилах, соответствующих рассматриваемому набору символов.
Двоичные же данные MySQL сортирует в порядке ASCII без учета регистра.
Перечисления и множества
MySQL предоставляет еще два особых типа данных, не имеющих аналога в mSQL. Тип
ENUM позволяет при создании таблицы указать список возможных значений
некоторого поля. Например, если бы у вас была колонка с именем «фрукт», в
которую вы разрешили бы помещать только значения «яблоко», «апельсин», «киви» и
«банан», ей следовало бы присвоить тип ENUM:
CREATE TABLE meal(meal_id INT NOT NULL PRIMARY KEY,
фрукт ENUM('яблоко', 'апельсин', 'киви', 'банан'))
При записи значения в эту колонку оно должно быть одним из перечисленных
фруктов. Поскольку MySQL заранее знает, какие значения допустимы для этой
колонки, она может абстрагировать их каким-либо числовым типом. Иными словами,
вместо того, чтобы хранить в колонке «яблоко» в виде строки, MySQL заменяет его
однобайтовым числом, а «яблоко» вы видите, когда обращаетесь к таблице или
выводите из нее результаты.
Тип MySQL SET работает аналогично, но позволяет одновременно хранить в поле
несколько значений.
Другие типы данных
|
|