Si je le fais, CAST(1 AS SIGNED INTEGER)
je finis toujours par obtenir un BIGINT
retour, par exemple:
$ 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)
Je m'attendais à ce que le type de retour de cette distribution soit un LONG
(entier 32 bits).
Si je sélectionne une colonne d'une table qui a un INT
je vois que c'est en effet juste un 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>
Si je transforme la même colonne en un entier signé, je reçois à nouveau un entier 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)
Il y a un problème similaire signalé ici:
Mais malheureusement, le PO ne reçoit pas de réponse claire.
Est-ce un bug dans la CAST()
fonction ou est-ce par conception?
SIGNED [INTEGER]
dans la section Le type du résultat peut être l' une des valeurs suivantes: . UnSIGNED INTEGER
dans le contexte d'unCAST
pas en fait un entier 32 bits?SELECT 1+1
résultats dans unBIGINT
. Mais cela n'explique toujours pas pourquoiCAST()
se comporte contrairement à la documentation (si je comprends bien) et produit unBIGINT
même si on lui demande de convertir enSIGNED INTEGER
ouUNSIGNED INTEGER
sur une seule valeur scalaire.Réponses:
Comme vous pouvez le voir sur https://www.w3schools.com/sql/func_mysql_cast.asp
Et à partir de la documentation MySQL officielle: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
Il semble donc que la sortie CAST sera en fait un entier 64 bits lorsque vous utilisez les types de données SIGNED ou UNSIGNED.
la source
Int store en 32 bits dans MySQL.
MySQL prend en charge l'arithmétique avec des valeurs 64 bits signées et non signées. Pour les opérateurs numériques (tels que + ou -) où l'un des opérandes est un entier non signé, le résultat n'est pas signé par défaut. Pour remplacer cela, utilisez l'opérateur de conversion SIGNED ou UNSIGNED pour convertir une valeur en un entier 64 bits signé ou non signé, respectivement.
C'est pourquoi est pour int il montre long int: 32 bits
et pour l'int signé, il montre long long int OU BIG int: 64 int
la source