Transmitir de VARCHAR a INT - MySQL

267

Mis datos actuales para

SELECT PROD_CODE FROM `PRODUCT`

es

PROD_CODE
2
5
7
8
22
10
9
11

He intentado las cuatro consultas y ninguna funciona. ( 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;

Todos los errores de sintaxis de lanzamiento, como a continuación:

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de ') COMO INT DEL LÍMITE DE PRODUCTO 0, 30' en la línea 1

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'INTEGER) DESDE EL LÍMITE DE PRODUCTO 0, 30' en la línea 1

¿Cuál es la sintaxis correcta para convertir varchar a entero en MySQL?

Versión de MySQL: 5.5.16

Lenin Raj Rajasekaran
fuente
¿Qué error informa para cada intento? ¿Cuáles son tus aportes? Se supone que debe fallar la consulta si la conversión falla para cualquier registro en el conjunto de resultados. Al menos, eso es lo que dice el estándar sql, aunque MySql es conocido por romper las reglas de seguridad en el estándar. Y, para el registro, las muestras enumeradas segunda y cuarta son correctas.
Joel Coehoorn

Respuestas:

552

Como se describe en Funciones y operadores de reparto :

El tipo para el resultado puede ser uno de los siguientes valores:

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

Por lo tanto, debe usar:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
fuente
77
Unsigned está funcionando. ¿Desde cuándo MySQL cambió el tipo de datos Integer a Unsigned?
Lenin Raj Rajasekaran
20
@emaillenin: los tipos de datos para la conversión no son los mismos que para las columnas, ya que se requiere información adicional sobre cómo interpretar los datos, por ejemplo, si los enteros están firmados o no.
eggyal
13
Gracias por esta información La documentación de MySQL es caótica para mí, así que esto ayudó mucho.
Racky
Estaba teniendo problemas con CAST (num_col AS DOUBLE (10,2) .. Más tarde lo cambié a DECIMAL (10,2) y funcionó. Tnanks
Nava Bogatee
Tenga en cuenta que en MariaDB CAST(PROD_CODE AS INT) funciona bien.
Paul Spiegel
57

Para convertir los campos / valores de varchar en formato numérico se puede usar un pequeño truco:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
fuente
9
¿Por qué alguna vez se usaría tal "pirateo" cuando existe una solución directa, documentada, compatible y recomendada?
eggyal
31
@eggyal TL; DR: el "hack" que está mencionando es una solución directa, documentada y recomendada. - - - - - - - - - - - - - Versión larga : del manual : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextaunque usaría en +0lugar de *1porque la adición es más rápida.
Mindwin
8
@BrianStinar la respuesta aceptada muestra claramente que existe una solución con una mejor semántica, pero a veces es conveniente que un valor primitivo se convierta implícitamente en otro primitivo, especialmente cuando se combinan cadenas y tipos numéricos. Entonces, los lenguajes de programación aleatorios para la existencia de esta característica parecen bastante inapropiados.
B12Toaster
¡No uses este tipo de hacks! - muy mala práctica que morderá mucho más tarde cuando el código esté lleno de estos y sea difícil de revertir
noches del
con esta respuesta, encontré algunas veces que terminaba con un float64 y por eso preferiría usarCONVERT('123456',UNSIGNED INTEGER)
Yitzchak Weingarten