mysql.h


CAST, CONVERT

CAST(expression AS type)
CONVERT(expression,type)
CONVERT(expr USING transcoding_name)

Las funciones CAST() y CONVERT() pueden usarse para tomar un valor de un tipo y obtener uno de otro tipo.

Los valores de 'type' pueden ser uno de los siguientes:

  • BINARY
  • CHAR
  • DATE
  • DATETIME
  • SIGNED {INTEGER}
  • TIME
  • UNSIGNED {INTEGER}

CAST() y CONVERT() están disponibles desde MySQL 4.0.2. La conversión del tipo CHAR desde 4.0.6. La forma USING de CONVERT() está disponible desde 4.1.0.

CAST() y CONVERT(... USING ...) forman parte de la sintaxis de SQL-99. La forma de CONVERT sin USING pertenece a la sintaxis de ODBC.

Las funciones de conversión de tipo son corrientes cuando se quiere crear una columna de un tipo específico en una sentencia CREATE ... SELECT:

CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);

También son útiles para ordenar columnas ENUM por orden alfabético. Normalmente, ordenar columnas ENUM usa los valores del orden numérico interno. Haciendo la conversión a CHAR resulta un orden alfabético:

SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);

CAST(string AS BINARY) es lo mismo que una cadena BINARY. CAST(expr AS CHAR) trata la expresión como una cadena con el juego de caracteres por defecto.

NOTA: En MysQL 4.0 la función CAST() para DATE, DATETIME o TIME sólo marca la columna para que sea de un tipo específico pero no cambia el valor de la columna.

En MySQL 4.1.0 el valor se conviete al tipo de columna correcto cuando se envía al usuario (esta es una característica del modo que que el nuevo protocolo en la versión 4.1 envía la información de fecha al cliente):

mysql> SELECT CAST(NOW() AS DATE);
       -> 2003-05-26

En versiones más recientes de MySQL (probablemente en 4.1.2 o 5.0) se corregirá este CAST para que también cambie el resultado si se usa como parte de una expresión más compleja, como CONCAT("Date: ",CAST(NOW() AS DATE)).

No se puede usar CAST() para extraer datos en diferentes formatos, pero en su lugar se pueden usar funciones de cadena como LEFT() o EXTRACT().

Para convertir una cadena a valor numérico, normalmente no hay que hacer nada; sencillamente se usa el valor de la cadena como si se tratase de un número:

mysql> SELECT 1+'1';
+-------+
| 1+'1' |
+-------+
|     2 |
+-------+
1 row in set (0.03 sec)

Si se usa un número en un contexto de cadena, el número se convertirá automáticamente a cadena BINARY:

mysql> SELECT CONCAT("hello you ",2);
+------------------------+
| CONCAT("hello you ",2) |
+------------------------+
| hello you 2            |
+------------------------+
1 row in set (0.02 sec)

MySQL soporta aritmética con valores de 64 bits, tanto con como sin signo. Si se usan operaciones numéricas (como +) y uno de los operandos es un entero sin signo, el resultado será sin signo. Se puede evitar esto usando una conversión de tipo SIGNED y UNSIGNED para los operadores para convertir el resultado a un entero de 64 bits con o sin signo, respectivamente.

mysql> SELECT CAST(1-2 AS UNSIGNED)
        -> 18446744073709551615
mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
        -> -1

Por otra parte, si cualquiera de los operandos en un valor en punto flotante, el resultado será un valor en punto flotante y no resulta afectado por la regla anterior. (En ese contexto, los valores DECIMAL serán promocionados a valores en punto flotante.)

mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
        -> -1.0

Si se usa una cadena en una operación aritmética, será convertida a un número en punto flotante.

La manipulación de valores son signo se cambió en MySQL 4.0 para permitir soportar valores BIGINT apropiadamente. Si se posee algún código que se pretende ejecutar tanto en MySQL 4.0 como en 3.23 (en cuyo caso probablemente no se podrá usar la función CAST()), se puede usar la siguiente técnica para obtener un resultado con signo cuando se restan dos columnas con enteros sin signo:

SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);

La idea es que las columnas se conviertan a valores en punto flotante antes de hacer la resta.

Si se tienen problemas con columnas UNSIGNED en una aplicación MySQL antigua cuando se porta a MySQL 4.0, se puede usar la opción --sql-mode=NO_UNSIGNED_SUBTRACTION cuando se arranca mysqld. Sin embargo, tan pronto se use esto, no será posible hacer un uso eficiente de columnas dek tipo BIGINT UNSIGNED.

CONVERT() con USING se usa para convertir datos entre diferentes juegos de caracteres. En MySQL, los nombres de traducción son los mismos que los nombres de los juegos de caracteres correspondientes. Por ejemplo, esta sentencia convierte la cadena 'abc' en el juego de caracteres por defecto del servidor a la cadena correspondiente en el juego de caracteres utf8:

SELECT CONVERT('abc' USING utf8);