Почему CAST (1 AS SIGNED INTEGER) возвращает BIGINT на MySQL?

8

Если я делаю, CAST(1 AS SIGNED INTEGER)я всегда получаю BIGINTвозвращенный, например:

$ mysql -u root -p --column-type-info
Enter password:

--- Copyright and help message snipped for brevity ---

mysql> select cast(1 as signed integer);
Field   1:  `cast(1 as signed integer)`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG            <== LONGLONG i.e. 64 bit integer
Collation:  binary (63)
Length:     1
Max_length: 1
Decimals:   0
Flags:      NOT_NULL BINARY NUM


+---------------------------+
| cast(1 as signed integer) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

Я ожидал бы, что тип возвращаемого значения из этого приведения будет LONG(32-битное целое).

Если я выберу столбец из таблицы, которая имеет, INTя вижу, что это действительно просто LONG:

mysql> describe contact;

+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| contact_id | int(11) | NO   | PRI | NULL    | auto_increment |

      == remainder of table snipped ==

mysql> select contact_id from contact where contact_id = 20;
Field   1:  `contact_id`
Catalog:    `def`
Database:   `centreon`
Table:      `contact`
Org_table:  `contact`
Type:       LONG                     <== LONG i.e. 32 bit integer
Collation:  binary (63)
Length:     11
Max_length: 2
Decimals:   0
Flags:      NOT_NULL PRI_KEY AUTO_INCREMENT NUM PART_KEY


+------------+
| contact_id |
+------------+
|         20 |
+------------+
1 row in set (0.00 sec)

mysql>

Если я приведу тот же столбец к целому числу со знаком, я снова получу 64-битное целое число:

mysql> select CAST(contact_id as signed integer) from contact where contact_id = 20;
Field   1:  `CAST(contact_id as signed integer)`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG
Collation:  binary (63)
Length:     11
Max_length: 2
Decimals:   0
Flags:      NOT_NULL BINARY NUM


+------------------------------------+
| CAST(contact_id as signed integer) |
+------------------------------------+
|                                 20 |
+------------------------------------+
1 row in set (0.00 sec)

Здесь есть аналогичная проблема:

http://bugs.mysql.com/bug.php?id=64084

Но, к сожалению, ОП не получает прямого ответа.

Это ошибка в CAST()функции или это дизайн?

Кев
источник
Глядя на документы для cast () / convert (), здесь упоминаются только 64-разрядные целые числа dev.mysql.com/doc/refman/5.7/en/…
Philᵀᴹ
@Phil - я читал это снова и снова. Почему это говорит SIGNED [INTEGER]в разделе Тип результата может быть одним из следующих значений: . Является ли SIGNED INTEGERв действительности CASTне 32-разрядным целым числом?
Кев
Я читал: «MySQL поддерживает арифметику с 64-разрядными значениями как со знаком, так и без знака. Если вы используете числовые операторы (такие как + или -), и один из операндов является целым числом без знака, по умолчанию результат не имеет знака (см. Раздел 12.6.1, «Арифметические операторы»). Вы можете переопределить это, используя оператор приведения SIGNED или UNSIGNED для приведения значения к 64-разрядному целому числу со знаком или без знака, соответственно. " часть
Philᵀᴹ
@Phil - да, я тоже это читал, и действительно, он ведет себя так, как ожидалось, т.е. делает SELECT 1+1результаты в BIGINT. Но это еще не объясняет , почему далеко CAST()ведет себя вопреки документации (как я понимаю) и производит BIGINTдаже если попросили преобразованный в SIGNED INTEGERили UNSIGNED INTEGERна одной скалярной величине.
Кев
Лучшее решение, которое я нашел здесь: конвертировать BIGINT UNSIGNED в INT

Ответы:

0

Как вы можете видеть на https://www.w3schools.com/sql/func_mysql_cast.asp

SIGNED Преобразует значение в SIGNED (64-разрядное целое число со знаком)

UNSIGNED Преобразует значение в UNSIGNED (64-разрядное целое число без знака)

И из официальной документации MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

MySQL поддерживает арифметику с 64-битными значениями со знаком и без знака. Для числовых операторов (таких как + или -), где один из операндов является целым числом без знака, результат по умолчанию является беззнаковым (см. Раздел 12.6.1, «Арифметические операторы»). Чтобы переопределить это, используйте оператор приведения SIGNED или UNSIGNED для приведения значения к 64-разрядному целому числу со знаком или без знака соответственно.

Похоже, что вывод CAST будет 64-битным целым числом, когда вы используете типы данных SIGNED или UNSIGNED.

Хесус Узканга
источник
-1

Int хранить как 32-битные в MySQL.

MySQL поддерживает арифметику с 64-битными значениями со знаком и без знака. Для числовых операторов (таких как + или -), где один из операндов является целым числом без знака, результат по умолчанию является без знака. Чтобы переопределить это, используйте оператор приведения SIGNED или UNSIGNED для приведения значения к 64-разрядному целому числу со знаком или без знака соответственно.

Вот почему для int он показывает long int: 32 bit

и для подписанного int он показывает long long int или BIG int: 64 int

Нишант Уппал
источник