Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT предназначен для представления вещественных чисел одинарной точности, в то время как типы данных DOUBLE и DECIMAL служат для представления вещественных чисел двойной точности.
Как и целые типы, эти типы принимают дополнительные аргументы: спецификацию ширины отображения и спецификацию десятичной части числа. Например, объявление FLOAT(5,2) задает длину отображаемых значений, равной не более 5 цифрам с двумя цифрами после десятичной точки. Рассмотрим примеры, которые это демонстрируют.
Типы FLOAT, DOUBLE, DECIMAL
+-----------+
4 rows л_п set (0.00 sec)
Значения, содержащие цифры после десятичной точки в количестве больше допустимого, автоматически округляются до ближайшего значения и только потом добавляются. Это демонстрирует следующий пример.
Типы FLOAT, DOUBLE, DECIMAL
Тип данных DECIMAL используется в вычислениях, требующих предельной точности, т.к. этот тип позволяет задавать в качестве дополнительных аргументов точность и масштаб. Здесь точность относится к количеству значащих цифр, которые могут храниться в значении, а масштаб - количество цифр после десятичной точки. Так, например, объявление DECIMAL (5,2) задает хранение значений, которые содержат не более 5 цифр при 2 цифрах после десятичной точки. Рассмотрим следующий пример, в котором это продемонстрировано.
Типы FLOAT, DOUBLE, DECIMAL
На заметку
Для более точного сохранения значений, MySQL хранит типы данных DECIMAL в символических строках.
Пропуск спецификации точности и масштаба для типа DECIMAL приводит к присвоению по умолчанию полям, объявленным таким образом, значения аргумента точности, равного 10, и масштаба, равного 0.
Листинг 5.9.
mysql> CREATE TABLE data (f_decimal DECIMAL);
Query OK, 0 rows affected (0.00 sec)
Типы FLOAT, DOUBLE, DECIMAL
Модификаторы UNSIGNED и ZEROFILL можно использовать и с типами данных FLOAT, DOUBLE, DECIMAL, при этом они действуют так же, как и в случае целых типов данных.
Строковые типы данных
MySQL имеет восемь основных строковых типов, которые можно использовать для хранения строковых данных, начиная с простейших строк, содержащих один символ, и заканчивая большими текстовыми или двоичными блоками данных. Перечень этих типов приводится в табл. 5.2.
Типы FLOAT, DOUBLE, DECIMAL
Типы CHAR и VARCHAR
Простейшим из всех перечисленных в табл. 5.2 типов является тип CHAR, который используется со строками фиксированной длины и объявляется со спецификацией размера, заключающейся в скобки. Размер может лежать в диапазоне от 0 до 255 и определять длину хранящегося значения - например, объявление CHAR(10) задает максимальную длину хранящейся строки, равной 10 символам. Значения меньше заданной длины будут дополняться справа нулями, значения больше указанной длины будут автоматически усечены. Обе эти ситуации продемонстрированы в следующем примере.
Типы FLOAT, DOUBLE, DECIMAL
Тип CHAR принимает необязательный модификатор BINARY, который приводит к обработке данного поля при операциях сравнения как двоичного (а не традиционного текстового). Следующий пример это наглядно демонстрирует.
Типы FLOAT, DOUBLE, DECIMAL
Таким образом, мы видим, что MySQL при использовании типа CHAR позволяет производить поиск без учета регистра, между строками 'hugo' и 'HUGO'. А теперь посмотрим, что происходит, если добавить к этому же объявлению модификатор BINARY.
Типы FLOAT, DOUBLE, DECIMAL
 Так как теперь для объявления поля используется двоичный тип, MySQL осуществляет двоичное сравнение, что совершенно очевидно приводит к сбою из-за несоответствия регистра. Одним из вариантов типа CHAR является тип VARCHAR, который используется для хранения строк переменной длины, он также должен сопровождаться спецификацией длины в диапазоне от 0 до 255. Разница между типами CHAR и VARCHAR заключается в том, как MySQL обрабатывает эту спецификацию. Тип CHAR считает это точной длиной значения, дополняя все значения, имеющие длину меньше заданной пробелами, в то время как тип VARCHAR рассматривает это как максимальный размер значений и использует только число байтов, действительно необходимых для хранения строки (плюс один байт, необходимый для хранения длины). Таким образом, короткие значения при сохранении в поле, которое сохраняется, как тип VARCHAR не дополняется пробелами. (А все более длинные значения также усекаются.)
Так как поля могут динамически расширяться и сужаться в зависимости от содержимого, этот тип лучше всего использовать тогда, когда вы не совсем уверены, сколько символов должно хранить данное поле. Тип VARCHAR использует только минимальное количество необходимых байтов, что может привести к повышению эффективности хранения и, возможно, к существенному улучшению рабочих характеристик разрабатываемой базы данных.
Как и тип CHAR, тип VARCHAR может сопровождаться необязательным модификатором BINARY, который обусловит его поведение как двоичных данных.