2012-07-21 11 views
10

Sé que es poco ortodoxo y potencialmente peligroso querer convertir algo de un tipo de datos de mayor a menor tamaño. Sin embargo, en este caso, es muy poco probable que el valor de la columna BIGINT UNSIGNED sea siempre mayor que el tamaño máximo de una columna INT.Convertir BIGINT SIN FIRMAR en INT

Entonces, usando MySQL, estoy leyendo la estructura de la tabla. Mientras leía la columna information_schema.columns.ordinal_position, me di cuenta de que es del tipo BIGINT UNSIGNED. Ahora, quiero esto como un INT en lugar de mis fines de procesamiento. Quiero convertir/convertir el tipo en SQL.

CAST y CONVERT solo me permiten cambiar el signo del tipo de datos, aparentemente.

SELECT CAST(ordinal_position AS SIGNED) 
FROM information_schema.columns 

Quiero la columna volvió específicamente como una INT. P.ej. cortar la columna en el valor máximo de INT y devolver ese valor.

Por ahora solo voy a cambiar el tipo de datos después de que retire el valor. Pero me gustaría saber cómo hacerlo en SQL.

Respuesta

6

this article parece tener una solución:

Create the function that will perform the conversion:

CREATE FUNCTION BigToInt (n BIGINT) RETURNS INTEGER RETURN n;

As you can see, the function is very short and simple: It takes a BIGINT and immediately returns it as an ordinary integer. However, one consequence of this is that some of the data will be truncated down to the largest possible value for Int.

(presumiblemente puede añadir "unsigned" a la firma - si no es todavía se puede combinar con el elenco que ya tiene que elimina la parte sin firmar).

+1

¿Cuál es la forma alternativa de hacerlo sin crear una función? Tener que recordar desmontar la función después de su uso es una molestia. – Pacerier

0

Si intenta crear la función de esa manera, obtendrá este error:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, 
or READS SQL DATA in its declaration and binary logging is enabled 
(you *might* want to use the less safe log_bin_trust_function_creators 
variable) 

Ver este enlace para obtener más información sobre la forma de resolverlo:

http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html

+1

En este caso particular, la solución es agregar 'DETERMINISTIC'. – dolmen

1

lamentablemente hice No tengo el derecho de crear funciones en el DB donde estaba trabajando, así que después de intentar algunas cosas, esto funcionó:

ALTER TABLE table_name MODIFY column_name INTEGER; 

Me salvó tener que reescribir 15 claves externas.

Cuestiones relacionadas