Типы данных столбцов
Символьные типы данных
Существуют следующие символьные типы данных: CHAR, VARCHAR, BLOB, TEXT, ENUM и SET. Рассмотрим описание их работы, требований к их хранению и использования их в запросах. В таблице 4.5 приведены символьные типы данных и их размерность.
Тип | Макс.размер | Байт |
---|---|---|
TINYTEXT или TINYBLOB | 2^8-1 | 255 |
TEXT или BLOB | 2^16-1 (64K-1) | 65535 |
MEDIUMTEXT или MEDIUMBLOB | 2^24-1 (16M-1) | 16777215 |
LONGBLOB | 2^32-1 (4G-1) | 4294967295 |
Типы данных CHAR и VARCHAR
Типы данных CHAR и VARCHAR очень схожи между собой, но различаются по способам их хранения и извлечения.
В столбце типа CHAR длина поля постоянна и задается при создании таблицы. Эта длина может принимать любое значение между 1 и 255. Величины типа CHAR при хранении дополняются справа пробелами до заданной длины. Эти концевые пробелы удаляются при извлечении хранимых величин.
Величины в столбцах VARCHAR представляют собой строки переменной длины. Так же как и для столбцов CHAR, можно задать столбец VARCHAR любой длины между 1 и 255. Однако, в противоположность CHAR, при хранении величин типа VARCHAR используется только то количество символов, которое необходимо, плюс один байт для записи длины. Хранимые величины пробелами не дополняются, наоборот, концевые пробелы при хранении удаляются.
Если задаваемая в столбце CHAR или VARCHAR величина превосходит максимально допустимую длину столбца, то эта величина соответствующим образом усекается.
Различие между этими двумя типами столбцов в представлении результата хранения величин с разной длиной строки в столбцах CHAR(4) и VARCHAR(4) проиллюстрировано следующей таблицей 4.6.
Величина | CHAR(4) | Требуемая память | VARCHAR(4) | Требуемая память |
---|---|---|---|---|
'' | ' ' | 4 байта | '' | 1 байт |
'ab' | 'ab ' | 4 байта | 'ab' | 3 байта |
'abcd' | 'abcd' | 4 байта | 'abcd' | 5 байтов |
'abcdefgh' | 'abcd' | 4 байта | 'abcd' | 5 байтов |
Извлеченные из столбцов CHAR(4) и VARCHAR(4) величины в каждом случае будут одними и теми же, поскольку при извлечении концевые пробелы из столбца CHAR удаляются.
Если при создании таблицы не был задан атрибут BINARY для столбцов, то величины в столбцах типа CHAR и VARCHAR сортируются и сравниваются без учета регистра. При задании атрибута BINARY величины в столбце сортируются и сравниваются с учетом регистра в соответствии с порядком таблицы ASCII на том компьютере, где работает сервер MySQL.
Типы данных BLOB и TEXT
Тип данных BLOB представляет собой двоичный объект большого размера, который может содержать переменное количество данных. Существуют 4 модификации этого типа - TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB, отличающиеся только максимальной длиной хранимых величин.
Тип данных TEXT также имеет 4 модификации - TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT, соответствующие упомянутым четырем типам BLOB и имеющие те же максимальную длину и требования к объему памяти. Единственное различие между типами BLOB и TEXT состоит в том, что сортировка и сравнение данных выполняются с учетом регистра для величин BLOB и без учета регистра для величин TEXT. Другими словами, TEXT - это независимый от регистра BLOB.
Если размер задаваемого в столбце BLOB или TEXT значения превосходит максимально допустимую длину столбца, то это значение соответствующим образом усекается.
Тип перечисления ENUM
ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Перечисление может иметь максимум 65535 элементов.
Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы.
Если вам нужно получить список возможных значений для столбца ENUM, вы должны вызвать SHOW COLUMNS FROM имя_таблицы LIKE имя_столбца_enum и проанализировать определение ENUM во втором столбце.
Тип множества SET
SET - это строковый тип, который может принимать ноль или более значений, каждое из которых должно быть выбрано из списка допустимых значений, определенных при создании таблицы. Элементы множества SET разделяются запятыми. Как следствие, сами элементы множества не могут содержать запятых.
Например, столбец, определенный как SET("один", "два") NOT NULL может принимать такие значения:
"" "один" "два" "один,два"
Множество SET может иметь максимум 64 различных элемента.
Оконечные пробелы удаляются из значений множества SET в момент создания таблицы.
Если вы вставляете в столбец SET некорректную величину, это значение будет проигнорировано.
Если вам нужно получить все возможные значения для столбца SET, вам следует вызвать SHOW COLUMNS FROM имя_таблицы LIKE имя_столбца_set и проанализировать SET-определение во втором столбце.
Выбор правильного типа данных в столбце
Для того чтобы память использовалась наиболее эффективно, всегда следует стараться применять тип данных, обеспечивающий максимальную точность. Например, для величин в диапазоне между 1 и 99999 в целочисленном столбце наилучшим типом будет MEDIUMINT UNSIGNED.
Часто приходится сталкиваться с такой проблемой, как точное представление денежных величин. В MySQL для представления таких величин необходимо использовать тип данных DECIMAL. Поскольку данные этого типа хранятся в виде строки, потерь в точности не происходит. А в случаях, когда точность не имеет слишком большого значения, вполне подойдет и тип данных DOUBLE.
Если же требуется высокая точность, всегда можно выполнить конвертирование в тип данных с фиксированной точкой. Такие данные хранятся в виде BIGINT. Это позволяет выполнять все вычисления с ними как с целыми числами, а впоследствии при необходимости результаты можно преобразовать обратно в величины с плавающей точкой.
Требования к памяти для различных типов столбцов
Требования к объему памяти для столбцов каждого типа, поддерживаемого MySQL, перечислены ниже по категориям.
Требования к памяти для числовых типов приведены в таблице 4.7
Тип столбца | Требуемая память |
---|---|
TINYINT | 1 байт |
SMALLINT | 2 байта |
MEDIUMINT | 3 байта |
INT | 4 байта |
INTEGER | 4 байта |
BIGINT | 8 байтов |
FLOAT(X) | 4, если X <= 24 или 8, если 25 <= X <= 53 |
FLOAT | 4 байта |
DOUBLE | 8 байтов |
DOUBLE PRECISION | 8 байтов |
REAL | 8 байтов |
DECIMAL(M,D) | M+2 байт, если D > 0, M+1 байт, если D = 0 (D+2, если M < D) |
NUMERIC(M,D) | M+2 байт, если D > 0, M+1 байт, если D = 0 (D+2, если M < D) |
Требования к памяти для типов даты и времени приведены в таблице 4.8.
Тип столбца | Требуемая память |
---|---|
DATE | 3 байта |
DATETIME | 8 байтов |
TIMESTAMP | 4 байта |
TIME | 3 байта |
YEAR | 1 байт |
Требования к памяти для символьных типов приведены в таблице 4.9.
Тип столбца | Требуемая память |
---|---|
CHAR(M) | M байт, 1 <= M <= 255 |
VARCHAR(M) | L+1 байт, где L <= M и 1 <= M <= 255 |
TINYBLOB, TINYTEXT | L+1 байт, где L < 2^8 |
BLOB, TEXT | L+2 байт, где L < 2^16 |
MEDIUMBLOB, MEDIUMTEXT | L+3 байт, где L < 2^24 |
LONGBLOB, LONGTEXT | L+4 байт, где L < 2^32 |
ENUM('value1','value2',...) | 1 или 2 байт, в зависимости от количества перечисляемых величин (максимум 65535) |
SET('value1','value2',...) | 1, 2, 3, 4 или 8 байт, в зависимости от количества элементов множества (максимум 64) |