Почему ifnull() возвращает ДЕСЯТИЧНОЕ число вместо BIGINT в MariaDB 10.1 ?

#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, в том, как обрабатывать возвращаемый тип по умолчанию.