#mysql #sql #mariadb #ifnull
#mysql #sql #mariadb #ifnull
Вопрос:
Почему ifnull() возвращает ДЕСЯТИЧНОЕ число вместо BIGINT в MariaDB 10.1?
Например:
Запрос:
select a, ifnull(b, 1) from table;
10.0.22-MariaDB:
ifnull(b, 1)
тип равен BIGINT
10.1.37-MariaDB:
ifnull(b, 1)
тип равен DECIMAL
Более того, в обеих версиях тип возвращаемого значения этого запроса одинаков:
select 1; //type is BIGINT
Зачем ifnull()
преобразовывать BIGINT
в DECIMAL
?
Комментарии:
1. каков фактический тип данных столбца ‘b’ в ‘таблице’?
2. @HartmutHolzgraefe TINYINT БЕЗ ЗНАКА
Ответ №1:
Я не могу воспроизвести проблему, смотрите Пример:
MariaDB [test]> SELECT VERSION();
Field 1: `VERSION()`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: VAR_STRING
Collation: utf8_general_ci (33)
Length: 72
Max_length: 24
Decimals: 31
Flags: NOT_NULL
-----------------
| VERSION() |
-----------------
| 10.1.38-MariaDB |
-----------------
1 row in set (0.00 sec)
MariaDB [test]> DROP TABLE IF EXISTS `test`;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> CREATE TABLE IF NOT EXISTS `test` (
-> `bigint` BIGINT,
-> `decimal` DECIMAL(5, 2)
-> );
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> INSERT INTO `test`
-> (`bigint`, `decimal`)
-> VALUES
-> (NULL, NULL);
Query OK, 1 row affected (0.00 sec)
MariaDB [test]> SELECT 1;
Field 1: `1`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: LONGLONG
Collation: binary (63)
Length: 1
Max_length: 1
Decimals: 0
Flags: NOT_NULL BINARY NUM
---
| 1 |
---
| 1 |
---
1 row in set (0.00 sec)
MariaDB [test]> SELECT
-> IFNULL(`bigint`, 1) `bigint`,
-> IFNULL(`decimal`, 1) `decimal`
-> FROM
-> `test`;
Field 1: `bigint`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: LONGLONG
Collation: binary (63)
Length: 20
Max_length: 1
Decimals: 0
Flags: NOT_NULL BINARY NUM
Field 2: `decimal`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: NEWDECIMAL
Collation: binary (63)
Length: 7
Max_length: 4
Decimals: 2
Flags: NOT_NULL BINARY NUM
-------- ---------
| bigint | decimal |
-------- ---------
| 1 | 1.00 |
-------- ---------
1 row in set (0.00 sec)
Комментарии:
1. Извините, тип данных столбца ‘b’ — TINYINT БЕЗ ЗНАКА
2. @Songe: Смотрите MDEV-10171: Неправильный тип поля для ОБЪЕДИНЕНИЯ с unsigned int .
3. @wchiquito — Как вы получили этот отладочный вывод?
4. @RickJames:
$ mysql --column-type-info
, смотрите Клиент командной строки mysql .
Ответ №2:
Тип возвращаемого значения по умолчанию будет получен в результате сравнения значений обоих типов, переданных функции, существует некоторый порядок возвращаемых типов: целое число перед bigint
TYPE (X,Y) = IFNULL(type X , type Y).
где десятичное число является более общим, чем bigin в вашем случае.
Я полагаю, что есть некоторые изменения, касающиеся обеих версий Mysql, в том, как обрабатывать возвращаемый тип по умолчанию.