Если я делаю, 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)
Здесь есть аналогичная проблема:
Но, к сожалению, ОП не получает прямого ответа.
Это ошибка в CAST()
функции или это дизайн?
SIGNED [INTEGER]
в разделе Тип результата может быть одним из следующих значений: . Является лиSIGNED INTEGER
в действительностиCAST
не 32-разрядным целым числом?SELECT 1+1
результаты вBIGINT
. Но это еще не объясняет , почему далекоCAST()
ведет себя вопреки документации (как я понимаю) и производитBIGINT
даже если попросили преобразованный вSIGNED INTEGER
илиUNSIGNED INTEGER
на одной скалярной величине.Ответы:
Как вы можете видеть на https://www.w3schools.com/sql/func_mysql_cast.asp
И из официальной документации MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
Похоже, что вывод CAST будет 64-битным целым числом, когда вы используете типы данных SIGNED или UNSIGNED.
источник
Int хранить как 32-битные в MySQL.
MySQL поддерживает арифметику с 64-битными значениями со знаком и без знака. Для числовых операторов (таких как + или -), где один из операндов является целым числом без знака, результат по умолчанию является без знака. Чтобы переопределить это, используйте оператор приведения SIGNED или UNSIGNED для приведения значения к 64-разрядному целому числу со знаком или без знака соответственно.
Вот почему для int он показывает long int: 32 bit
и для подписанного int он показывает long long int или BIG int: 64 int
источник