Se eu fizer CAST(1 AS SIGNED INTEGER)
, sempre acabo recebendo um BIGINT
retorno, por exemplo:
$ 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)
Eu esperava que o tipo de retorno desse elenco fosse um LONG
(inteiro de 32 bits).
Se eu selecionar uma coluna de uma tabela que possui um INT
, vejo que é realmente apenas um 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>
Se eu converter a mesma coluna em um número inteiro assinado, recebo novamente um número inteiro de 64 bits:
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)
Há um problema relatado de maneira semelhante aqui:
Mas, infelizmente, o OP não recebe uma resposta direta.
Isso é um bug na CAST()
função ou é por design?
SIGNED [INTEGER]
na seção O tipo para o resultado pode ser um dos seguintes valores: . A éSIGNED INTEGER
no contexto de umCAST
não de fato um número inteiro de 32 bits?SELECT 1+1
resultados em umBIGINT
. Mas ainda não explica por queCAST()
se comporta de maneira contrária à documentação (como eu a entendo) e produz umBIGINT
mesmo que seja solicitado a converter emSIGNED INTEGER
ouUNSIGNED INTEGER
com um único valor escalar.Respostas:
Como você pode ver em https://www.w3schools.com/sql/func_mysql_cast.asp
E da documentação oficial do MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
Parece que a saída CAST será realmente um número inteiro de 64 bits quando você usar tipos de dados SIGNED ou UNSIGNED.
fonte
Int armazena como 32 bits no MySQL.
O MySQL suporta aritmética com valores de 64 bits assinados e não assinados. Para operadores numéricos (como + ou -) em que um dos operandos é um número inteiro não assinado, o resultado é não assinado por padrão. Para substituir isso, use o operador de conversão SIGNED ou UNSIGNED para converter um valor em um número inteiro de 64 bits com ou sem sinal, respectivamente.
É por isso que, para int, está mostrando int longo: 32 bits
e para int assinado, está mostrando long long int OR BIG int: 64 int
fonte