Приведение к типам INT
Из string
Строгий режим
Если исходный тип допускает NULL, возвращается тип, допускающий NULL;
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL;
Определение в BNF
<integer> ::= <whitespace>* <sign>? <decimal_digit>+ <whitespace>*
<sign> ::= "+" | "-"
<decimal_digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил
-
Поддерживаются только числа в десятичной системе счисления;
-
Перед числом может стоять знак плюса или минуса;
-
В начале и конце строк допускаются произвольные пробельные символы, включая: ' ', '\t', '\n', '\r', '\f', '\v';
-
Экспоненциальная запись не поддерживается;
-
Для других форматов возвращается ошибка;
-
При переполнении возвращается ошибка.
Примеры
| Строка | Результат приведения к int | Примечание |
|---|---|---|
| "2147483647" | 2147483647 | |
| "-2147483648" | -2147483648 | |
| " \t\r\n\f\v2147483647 \t\r\n\f\v" | 2147483647 | С пробельными символами в начале и конце |
| " \t\r\n\f\v+2147483647 \t\r\n\f\v" | 2147483647 | С пробельными символами в начале и конце, со знаком плюса |
| " \t\r\n\f\v-2147483648 \t\r\n\f\v" | -2147483648 | С пробельными символами в начале и конце, со знаком минуса |
| 'abc' | Error | Недопустимый формат |
| '123.456' | Error | Дробная запись не поддерживается |
| '1.23456e5' | Error | Экспоненциальная запись не поддерживается |
| '2147483648' | Error | Переполнение |
| '-2147483649' | Error | Переполнение |
Нестрогий режим
Всегда возвращается тип, допускающий NULL.
Определение в BNF
<integer_non_strict> ::= <whitespace_char>* <sign>? <number> <whitespace_char>*
<sign> ::= "+" | "-"
<number> ::= <decimal_number> | <decimal_number> "." <decimal_number> | <decimal_number> "." | "." <decimal_number>
<decimal_number> ::= <decimal_digit>+
<decimal_digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace_char> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил
-
Поддерживаются все допустимые форматы строгого режима;
-
Поддерживается формат строгого режима с добавленной дробной частью; при преобразовании дробная часть отбрасывается;
-
Строки в экспоненциальной записи преобразуются в NULL;
-
Все остальные форматы преобразуются в NULL;
-
При переполнении значение преобразуется в NULL.
Примеры
| Строка | Результат приведения к int | Примечание |
|---|---|---|
| "2147483647" | 2147483647 | |
| "-2147483648" | -2147483648 | |
| " \t\r\n\f\v2147483647 \t\r\n\f\v" | 2147483647 | С пробельными символами в начале и конце |
| " \t\r\n\f\v+2147483647 \t\r\n\f\v" | 2147483647 | С пробельными символами в начале и конце, со знаком плюса |
| " \t\r\n\f\v-2147483648 \t\r\n\f\v" | -2147483648 | С пробельными символами в начале и конце, со знаком минуса |
| '123.456' | 123 | |
| '1.23456e5' | NULL | Экспоненциальная запись |
| 'abc' | NULL | Недопустимый формат |
| '2147483648' | NULL | Переполнение |
| '-2147483649' | NULL | Переполнение |
Из bool
true преобразуется в 1, false преобразуется в 0.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Из целочисленного типа в целочисленный тип
Поддерживается преобразование между любыми целочисленными типами.
Строгий режим
При переполнении возвращается ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| Bigint | int | Примечание |
|---|---|---|
| 2147483647 | 2147483647 | |
| 2147483648 | Error | Переполнение |
| -2147483649 | Error | Переполнение |
Нестрогий режим
Начиная с версии 4.0 при переполнении возвращается NULL вместо неопределённого значения.
При переполнении возвращается NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast bigint as int), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL (например,
cast int as bigint).
Примеры
| Bigint | int | Примечание |
|---|---|---|
| 2147483647 | 2147483647 | |
| 2147483648 | NULL | Переполнение |
| -2147483649 | NULL | Переполнение |
Из date
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Описание правил
Начиная с версии 4.0 приведение date к tinyint и smallint больше не поддерживается.
-
Приведение к tinyint и smallint не поддерживается, поскольку оно неизбежно приводит к переполнению.
-
Поддерживается приведение к int, bigint и largeint. Числовые значения года, месяца и дня даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами и дополняются ведущим 0, если их значение меньше 10.
Примеры
| date | int |
|---|---|
| 2025-03-14 | 20250314 |
Из datetime
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Описание правил
Начиная с версии 4.0 приведение datetime к tinyint, smallint и int больше не поддерживается.
-
Приведение к tinyint, smallint, int не поддерживается, поскольку оно неизбежно приводит к переполнению;
-
Поддерживается приведение к bigint, largeint. Микросекундная часть datetime отбрасывается, затем значения года, месяца, дня, часа, минуты и секунды последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами и дополняются ведущим 0, если их значение меньше 10.
Примеры
| datetime | int |
|---|---|
| 2025-03-14 17:00:01.123456 | 20250314170001 |
| 9999-12-31 23:59:59.999999 | 99991231235959 |
Из TIMESTAMP_NS
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Описание правил
-
Приведение к tinyint, smallint или int не поддерживается, поскольку оно неизбежно приводит к переполнению.
-
Поддерживается приведение к bigint и largeint. Наносекундная часть TIMESTAMP_NS отбрасывается, затем значения года, месяца, дня, часа, минуты и секунды последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами и дополняются ведущим 0, если их значение меньше 10.
Примеры
| Входное значение TIMESTAMP_NS | Целевой тип | Результат |
|---|---|---|
1677-09-21 00:12:43.145224192 | BIGINT | 16770921001243 |
1969-12-31 23:59:59.999999999 | BIGINT | 19691231235959 |
2024-02-29 12:34:56.123456789 | LARGEINT | 20240229123456 |
2262-04-11 23:47:16.854775807 | LARGEINT | 22620411234716 |
Из float/double
Округление не поддерживается.
Строгий режим
Описание правил
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
-
При переполнении возвращается ошибка;
-
Для значений Infinity и NaN возвращается ошибка.
Примеры
| float/double | Приведение к int | Примечание |
|---|---|---|
| 1.5 | 1 | Отбрасывание дробной части |
| 1.79769E308 | Error | Переполнение |
| Infinity | Error | |
| NaN | Error |
Нестрогий режим
Всегда возвращается тип, допускающий NULL.
Описание правил
Начиная с версии 4.0 при переполнении возвращается NULL вместо неопределённого значения.
-
При переполнении значение преобразуется в NULL;
-
Infinity преобразуется в NULL;
-
NaN преобразуется в NULL.
Примеры
| float/double | Приведение к int | Примечание |
|---|---|---|
| 1.5 | 1 | Отбрасывание дробной части |
| 1.79769E308 | NULL | Переполнение |
| Infinity | NULL | |
| -Infinity | NULL | |
| NaN | NULL |
Из decimal
Округление не поддерживается.
Строгий режим
При переполнении возвращается ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| Decimal(18, 6) | int | Примечание |
|---|---|---|
| 1.654321 | 1 | Отбрасывание дробной части |
| 12345678901.123 | Error | Переполнение |
Нестрогий режим
При переполнении значение преобразуется в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast decimal(18, 0) as int), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL (например,
cast decimal(9, 0) as bigint).
Примеры
| Decimal(18, 6) | int | Примечание |
|---|---|---|
| 1.654321 | 1 | Отбрасывание дробной части |
| 12345678901.123 | NULL | Переполнение |
Из time
Преобразуется в количество микросекунд.
Строгий режим
При переполнении возвращается ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| Time | int | Примечание |
|---|---|---|
| 00:00:01 | 1000000 | |
| 838:59:58 | Error | Переполнение |
Нестрогий режим
Начиная с версии 4.0 при переполнении возвращается NULL вместо неопределённого значения.
При переполнении значение преобразуется в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast time as tinyint), возвращается тип, допускающий NULL; -
В остальных случаях возвращается тип, не допускающий NULL (например,
cast time as bigint).
Примеры
| Time | int | Примечание |
|---|---|---|
| 00:00:01 | 1000000 | |
| 838:59:58 | NULL | Переполнение |
Другие типы
Не поддерживаются