Cast de VARCHAR vers INT - MySQL

267

Mes données actuelles pour

SELECT PROD_CODE FROM `PRODUCT`

est

PROD_CODE
2
5
7
8
22
10
9
11

J'ai essayé les quatre requêtes et aucune ne fonctionne. ( Réf )

SELECT CAST(PROD_CODE) AS INT FROM PRODUCT;

SELECT CAST(PROD_CODE AS INT) FROM PRODUCT;

SELECT CAST(PROD_CODE) AS INTEGER FROM PRODUCT;

SELECT CAST(PROD_CODE AS INTEGER) FROM PRODUCT;

Toutes les erreurs de syntaxe de lancement telles que ci-dessous:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de ') AS INT FROM PRODUCT LIMIT 0, 30' à la ligne 1

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'INTEGER) FROM PRODUCT LIMIT 0, 30' à la ligne 1

Quelle est la bonne syntaxe pour convertir varchar en entier dans MySQL?

Version de MySQL: 5.5.16

Lénine Raj Rajasekaran
la source
Quelle erreur signale-t-il pour chaque tentative? Quelles sont vos contributions? Il est censé faire échouer la requête si la conversion échoue pour un enregistrement du jeu de résultats. C'est du moins ce que dit la norme SQL, bien que MySql soit connu pour avoir enfreint les règles de sécurité de la norme. Et, pour mémoire, les 2ème et 4ème échantillons listés sont corrects.
Joel Coehoorn

Réponses:

552

Comme décrit dans Cast Functions and Operators :

Le type du résultat peut être l'une des valeurs suivantes:

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

Par conséquent, vous devez utiliser:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
la source
7
Non signé fonctionne. Depuis quand MySQL a-t-il changé le type de données Integer en Non signé?
Lénine Raj Rajasekaran
20
@emaillenin: Les types de données pour la conversion ne sont pas les mêmes que ceux des colonnes, car des informations supplémentaires sont nécessaires sur la façon d'interpréter les données, par exemple si les entiers sont signés ou non.
eggyal
13
Merci pour cette info. La documentation MySQL est chaotique pour moi, donc cela m'a beaucoup aidé.
Racky
J'avais des problèmes avec CAST (num_col AS DOUBLE (10,2) .. Plus tard, je l'ai changé en DECIMAL (10,2) et cela a fonctionné. Tnanks
Nava Bogatee
Notez que sur MariaDB CAST(PROD_CODE AS INT) fonctionne très bien.
Paul Spiegel du
57

Pour convertir des champs / valeurs varchar au format numérique, un petit piratage peut être utilisé:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
la source
9
Pourquoi utiliser un tel «hack» alors qu'il existe une solution simple, documentée, prise en charge et recommandée?
eggyal
31
@eggyal TL; DR: le "hack" dont vous parlez est une solution simple, documentée et recommandée. - - - - - - - - - - - - - - Version longue : Du manuel : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextBien que j'utiliserais à la +0place *1car l'ajout est plus rapide.
Mindwin
8
@BrianStinar, la réponse acceptée montre clairement qu'il existe une solution avec une meilleure sémantique, mais parfois il est juste pratique qu'une valeur primitive soit implicitement castée en une autre primitive, en particulier lors de la combinaison de chaînes et de types numériques. Donc, dénigrer au hasard les langages de programmation pour l'existence de cette fonctionnalité semble plutôt inapproprié.
B12Toaster
N'utilisez pas ce type de hacks! - très mauvaise pratique qui mordra beaucoup plus tard lorsque le code en sera plein et difficile à revenir
nuits
avec cette réponse, j'ai trouvé quelques fois se retrouver avec un float64 que pourquoi je préférerai utiliserCONVERT('123456',UNSIGNED INTEGER)
Yitzchak Weingarten