Por que o CAST (1 COMO ASSINADO INTEIRO) retorna um BIGINT no MySQL?


8

Se eu fizer CAST(1 AS SIGNED INTEGER), sempre acabo recebendo um BIGINTretorno, 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:

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

Mas, infelizmente, o OP não recebe uma resposta direta.

Isso é um bug na CAST()função ou é por design?


Observando os documentos de cast () / convert (), ele menciona apenas números inteiros de 64 bits dev.mysql.com/doc/refman/5.7/en/…
Philᵀᴹ

@ Phil - eu li isso várias vezes. Por que diz SIGNED [INTEGER]na seção O tipo para o resultado pode ser um dos seguintes valores: . A é SIGNED INTEGERno contexto de um CASTnão de fato um número inteiro de 32 bits?
Kev

Eu estava lendo o "O MySQL suporta aritmética com valores de 64 bits assinados e não assinados. Se você estiver usando operadores numéricos (como + ou -) e um dos operandos for um número inteiro não assinado, o resultado será não assinado por padrão (consulte a Seção 12.6.1, “Operadores aritméticos”). Você pode substituir isso usando 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. " parte
Philᵀᴹ

@ Phil - Sim, eu li isso também, e de fato que se comporta como o esperado, ou seja, fazendo SELECT 1+1resultados em um BIGINT. Mas ainda não explica por que CAST()se comporta de maneira contrária à documentação (como eu a entendo) e produz um BIGINTmesmo que seja solicitado a converter em SIGNED INTEGERou UNSIGNED INTEGERcom um único valor escalar.
Kev

A melhor solução que encontrei aqui: Converter BIGINT UNSIGNED para INT

Respostas:


0

Como você pode ver em https://www.w3schools.com/sql/func_mysql_cast.asp

SIGNED Converte valor em SIGNED (um número inteiro de 64 bits assinado)

UNSIGNED Converte valor em UNSIGNED (um número inteiro de 64 bits não assinado)

E da documentação oficial do MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

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 sem sinal, o resultado é sem sinal por padrão (consulte a Seção 12.6.1, “Operadores aritméticos”). 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.

Parece que a saída CAST será realmente um número inteiro de 64 bits quando você usar tipos de dados SIGNED ou UNSIGNED.


-1

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.