Cast von VARCHAR nach INT - MySQL

266

Meine aktuellen Daten für

SELECT PROD_CODE FROM `PRODUCT`

ist

PROD_CODE
2
5
7
8
22
10
9
11

Ich habe alle vier Abfragen ausprobiert und keine funktioniert. ( Ref )

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;

Alle werfen Syntaxfehler wie folgt:

Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von ') AS INT FROM PRODUCT LIMIT 0, 30' in Zeile 1

Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'INTEGER) FROM PRODUCT LIMIT 0, 30' in Zeile 1

Was ist die richtige Syntax, um varchar in MySQL in eine Ganzzahl umzuwandeln?

MySQL Version: 5.5.16

Lenin Raj Rajasekaran
quelle
Welchen Fehler meldet es bei jedem Versuch? Was sind deine Eingaben? Es sollte die Abfrage fehlschlagen , wenn die Besetzung für jeden Datensatz in der Ergebnismenge ausfällt. Zumindest sagt das der SQL-Standard, obwohl MySql dafür berüchtigt ist, die Sicherheitsregeln des Standards zu brechen. Und für die Aufzeichnung sind die 2. und 4. aufgelisteten Proben korrekt.
Joel Coehoorn

Antworten:

551

Wie unter Besetzungsfunktionen und Operatoren beschrieben :

Der Typ für das Ergebnis kann einer der folgenden Werte sein:

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

Daher sollten Sie verwenden:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
quelle
7
Unsigned funktioniert. Ab wann hat MySQL den Datentyp Integer in Unsigned geändert?
Lenin Raj Rajasekaran
20
@emaillenin: Die Datentypen für das Casting sind nicht dieselben wie für Spalten, da zusätzliche Informationen zur Interpretation von Daten erforderlich sind, z. B. ob Ganzzahlen signiert sind oder nicht.
Eggyal
13
Danke für diese Info. Die MySQL-Dokumentation ist für mich chaotisch, daher hat dies sehr geholfen.
Racky
Ich hatte Probleme mit CAST (num_col AS DOUBLE (10,2). Später habe ich es in DECIMAL (10,2) geändert und es hat funktioniert. Tnanks
Nava Bogatee
Beachten Sie, dass auf MariaDB gut CAST(PROD_CODE AS INT) funktioniert .
Paul Spiegel
56

Zum Umwandeln von Varchar-Feldern / -Werten in das Zahlenformat kann wenig Hack verwendet werden:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
quelle
9
Warum sollte man jemals einen solchen "Hack" verwenden, wenn es eine einfache, dokumentierte, unterstützte und empfohlene Lösung gibt?
Eggyal
31
@eggyal TL; DR: Der von Ihnen erwähnte "Hack" ist eine einfache, dokumentierte und empfohlene Lösung. - - - - - - - - - - - - - - Lange Version : Aus dem Handbuch : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextObwohl ich +0stattdessen verwenden würde, *1da das Hinzufügen schneller ist.
Mindwin
8
@BrianStinar Die akzeptierte Antwort zeigt deutlich, dass es eine Lösung mit besserer Semantik gibt, aber manchmal ist es nur praktisch, dass ein Grundwert implizit in ein anderes Grundelement umgewandelt wird, insbesondere wenn Zeichenfolgen und numerische Typen kombiniert werden. Das zufällige Bashing von Programmiersprachen für die Existenz dieser Funktion erscheint daher eher unangemessen.
B12Toaster
Verwenden Sie diese Art von Hacks nicht! - sehr schlechte Praxis, die viel später zurückbeißen wird, wenn der Code voll davon ist und schwer zurückzusetzen ist
Nächte