Почему ifnull () возвращает DECIMAL вместо BIGINT в MariaDB 10.1+?

0

Почему 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?

  • 0
    каков фактический тип данных столбца «b» в «таблице»?
  • 0
    @HartmutHolzgraefe TINYINT НЕ ПОДПИСАНО
Теги:
mariadb
ifnull

2 ответа

0

Я не могу воспроизвести проблему, см. Пример:

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)
Показать ещё 2 комментария
0

Тип возвращаемого значения по умолчанию будет результатом сравнения значений обоих типов, передаваемых в функцию, есть некоторый порядок возвращаемых типов: целое число перед bigint

TYPE (X,Y) = IFNULL(type X , type Y). 

где десятичная дробь более общая, чем bigin в вашем случае.

Я предполагаю, что есть некоторые изменения, касающиеся обеих версий Mysql, а также того, как обрабатывать возвращаемый тип по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню