Функции преобразования типов, CAST

Когда мы выполняем операции со значениями с разными типами данных, СУБД пытается выполнить преобразование и привести используемые значения к нужному типу. Например, в примере ниже мы сравниваем значения с типами STRING и INT. Чтобы выполнить это сравнение СУБД автоматически сконвертирует строковое значение в числовое.

MySQL 8.1
SELECT '50' > 49 AS comparison_1, '50' > 51 AS comparison_2;
comparison_1comparison_2
10
MySQL 8.1
SELECT '50' > 49 AS comparison_1, '50' > 51 AS comparison_2;
comparison_1comparison_2
truefalse

Но не все преобразования СУБД может сделать автоматически, и тогда необходимо делать явное преобразование типов.

Для этого в MySQL есть две очень схожие функции CAST и CONVERT.

Для этого в PostgreSQL есть функция CAST и оператор ::.

Синтаксис

MySQL 8.1
CAST(значение AS тип_для_конвертации);
CONVERT(значение, тип_для_конвертации);

Например,

MySQL 8.1
SELECT CAST(12005.6 AS DECIMAL) AS cast_example, CONVERT(12005.4, DECIMAL) AS convert_example;
cast_exampleconvert_example
1200612005
MySQL 8.1
CAST(значение AS тип_для_конвертации);
значение::тип_для_конвертации;

Например,

MySQL 8.1
SELECT CAST(12005.6 AS NUMERIC) AS cast_example, 12005.4::NUMERIC AS operator_example;
cast_exampleoperator_example
1200612005

Функция CAST умеет конвертировать переданное значение в любой из следующих типов:

ТипОписание
DATEКонвертирует значение в DATE. Формат: "YYYY-MM-DD".
DATETIMEКонвертирует значение в DATETIME. Формат: "YYYY-MM-DD hh:mm:ss".
TIMEКонвертирует значение в TIME. Формат: "hh:mm:ss".
DECIMAL[(M[,D])]Конвертирует значение в DECIMAL. Имеет два необязательных аргумента M и D, определяющих максимальное количество знаков до и после запятой соответственно. По умолчанию, D равен 0, а M равен 10.
CHAR[(N)]Конвертирует значение в CHAR. В качестве необязательного аргумента можно передать максимальную длину строки.
SIGNEDКонвертирует значение в значение BIGINT.
UNSIGNEDКонвертирует значение в беззнаковое значение BIGINT.
BINARYКонвертирует значение в BINARY.
YEARКонвертирует значение в год.

Функция CAST умеет конвертировать переданное значение в любой из следующих типов:

ТипОписание
DATEКонвертирует значение в DATE. Формат: "YYYY-MM-DD".
TIMESTAMPКонвертирует значение в TIMESTAMP. Формат: "YYYY-MM-DD hh:mm:ss".
TIMEКонвертирует значение в TIME. Формат: "hh:mm:ss".
NUMERIC[(M[,D])]Конвертирует значение в NUMERIC. Имеет два необязательных аргумента M и D, определяющих максимальное количество знаков до и после запятой соответственно.
VARCHAR[(N)]Конвертирует значение в VARCHAR. В качестве необязательного аргумента можно передать максимальную длину строки.
INTEGERКонвертирует значение в целое число.
BIGINTКонвертирует значение в большое целое число.
BOOLEANКонвертирует значение в логический тип.
TEXTКонвертирует значение в текстовый тип.

Невозможность любой конвертации

Использование функции CAST накладывает требования к формату исходного значения. И сразу же напрашивается вопрос, что произойдёт, если данный формат не будет соответствовать необходимому? Например, если попробовать сконвертировать случайный текст во временной тип данных:

MySQL 8.1
SELECT CAST('SQL Academy' AS DATETIME) AS invalid_cast;
invalid_cast
<NULL>

В этом случае MySQL вернёт NULL вместо сконвертированного значения.

MySQL 8.1
SELECT CAST('SQL Academy' AS TIMESTAMP) AS invalid_cast;

В этом случае PostgreSQL вернёт ошибку, так как строка не может быть сконвертирована в дату.

Самопроверка

Итак, за что отвечает функция CAST в SQL 🧐?