Почему ifnull() возвращает DECIMAL вместо 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
?
Я не могу воспроизвести проблему, см. Пример:
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)
Тип возвращаемого значения по умолчанию будет результатом сравнения значений обоих типов, передаваемых в функцию, есть некоторый порядок возвращаемых типов: целое число перед bigint
TYPE (X,Y) = IFNULL(type X , type Y).
где десятичная дробь более общая, чем bigin в вашем случае.
Я предполагаю, что есть некоторые изменения, касающиеся обеих версий Mysql, а также того, как обрабатывать возвращаемый тип по умолчанию.