2012-08-26 18 views
175

Mi Datos actuales paramoldeada de VARCHAR a INT - MySQL

SELECT PROD_CODE FROM `PRODUCT` 

es

PROD_CODE 
2 
5 
7 
8 
22 
10 
9 
11 

He probado todos los cuatro consultas y ninguno trabaja. (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 tiro como a continuación:

Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ') COMO INT DESDE EL LÍMITE DEL PRODUCTO 0, 30' en la línea 1

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca de 'INTEGER) a partir del producto límite de 0, 30' en la línea 1

¿Cuál es la sintaxis derecho a emitir varchar a un entero en MySQL ?

MySQL Version: 5.5.16

+0

¿Qué error informa para cada intento? ¿Cuáles son tus entradas? Se supone que fallará la consulta si el lanzamiento falla para cualquier registro en el conjunto de resultados.Al menos, eso es lo que dice el estándar sql, aunque MySql es notorio por romper las reglas de seguridad en el estándar. Y, para el registro, las muestras listadas en 2da y 4ta son correctas. –

Respuesta

384

Como se describe en Cast Functions and Operators:

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, se debe utilizar:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT 
+4

Unsigned está funcionando. ¿Desde cuándo MySQL cambió el tipo de datos Integer a Unsigned? – emaillenin

+12

@emaillenin: los tipos de datos para el casting no son los mismos que para las columnas, ya que se requiere información adicional sobre cómo interpretar los datos, p. si los enteros están firmados o no. – eggyal

+8

Gracias por esta información. La documentación de MySQL es caótica para mí, así que esto ayudó mucho. – Racky

24

para la fundición campos varchar/valores al formato de número puede ser pequeño truco utilizado:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT` 
+6

¿Por qué alguna vez se podría usar un "hack" cuando hay una simple , documentación, soporte y solución recomendada? – eggyal

+8

@eggyal ** TL; DR: ** el "truco" que usted menciona, es una solución directa, documentada y recomendada. - - - - - - - - - - - - - * * Versión larga **: de [el manual] (http://dev.mysql.com/doc/refman/5.7/en/cast-functions.html): 'Para convertir una cadena en un número, normalmente necesita hacer nada más que usar el valor de cadena en contexto numérico' Aunque usaría '+ 0' en lugar de' * 1' ya que la adición es más rápida. – Mindwin

+0

Esta "solución recomendada" explica por qué MySQL funciona bien con Apache y PHP. –

-1

Si se utiliza laravel, puede utilizar:

YourModel::select(DB::raw('CAST(PROD_CODE AS UNSIGNED)'))->... // under select 

O si lo desea utilizarlo en un where

->whereRaw('CAST(reference_number AS UNSIGNED) = '.intval($value))-> 
// well, you can ignore the intval(), but it makes sense if the value you are using may be having, for example, preceding zeros e.g. 0003,