Funções de Conversão
As funções CAST() e CONVERT() devem ser usada para tomar um valor de um tipo e produzir um valor de outro tipo. As suas sintaxes são as seguintes:
CAST(expressão AS tipo) CONVERT(expressão,tipo) CONVERT(expr USING transcoding_name)
O valor tipo pode ser um dos seguintes:
BINARYCHARDATEDATETIMESIGNED {INTEGER}TIMEUNSIGNED {INTEGER}
CAST() e CONVERT() estão disponíveis a partir do MariaDB 4.0.2. O tipo de conversão CHAR está disponível a partir do versão 4.0.6. A forma USING de CONVERT() está disponível a partir da versão 4.1.0.
CAST() e CONVERT(... USING ...) são da sintaxe SQL-99. A forma não-USING de CONVERT() é da sintaxe ODBC.
CAST() é da sintaxe SQL-99 syntax e CONVERT() é da sintaxe ODBC.
As funções de conversão são principalmente úteis quando você deseja criar uma coluna com um tipo específico em uma CREATE ... SELECT:
CREATE TABLE nova_tabela SELECT CAST('2000-01-01' AS DATE);
As funções também podem ser úteis para ordenar colunas ENUM na ordem lexicográfica. Normalmente a ordenação das colunas ENUM ocorrem usando os valores numéricos internos. Converter os valores para CHAR resultam em uma ordenação lexicográfica:
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(string AS BINARY) é a mesma coisa que BINARY string. CAST(expr AS CHAR) trata a expressão como uma string com o conjunto de caracteres padrão.
NOTA: No MariaDB o CAST() para DATE, DATETIME ou TIME só marca a coluna para ser um tipo específico mas não altera o valor da coluna.
No MariaDB 4.1.0 o valor será convertido para a coluna correta quando for enviado para o usuário (este é um recurso de como o novo protocolo na versão 4.1 envia as informações de data para o cliente):
mysql> SELECT CAST(NOW() AS DATE);
-> 2003-05-26
Em versões futuras do MariaDB (provavelmente 4.1.2 ou 5.0) iremos corrigir o fato de que CAST também altera o resultado se você usá-lo como parte de uma expressão mais complexa, como CONCAT('Data: ',CAST(NOW() AS DATE)).
Você não deve utilizar CAST() para extrair dados em formatos diferentes, mas sim para usar funções strins como LEFT ou EXTRACT(). Leia "Funções de Data e Hora".
Para converter uma string para um valor numérico, normalmente não é necessário se fazer nada; apenas use a string como se fosse um número:
mysql> SELECT 1+'1';
-> 2
Se você usar um número em um contexto string, o número será convertido automaticamente para uma string BINARY.
mysql> SELECT CONCAT('hello you ',2);
-> 'hello you 2'
O MariaDB suporta aritimético com valores de 64 bits com sinal e sem sinal. Se você está usando operações numéricas (como +) e um dos operandos é unsigned integer (inteiro sem sinal), o resultado também será sem sinal (unsigned). Você pode forçar o tipo usando os operadores de conversão SIGNED e UNSIGNED para converter a operação para um inteiro de 64 bits com sinal e sem sinal, respectivamente.
mysql>SELECT CAST(1-2 AS UNSIGNED)-> 18446744073709551615 mysql>SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);-> -1
Note que se um dos operandos for um valor de ponto flutuante o resultado é um valor de ponto flutuante e não é afetado pela regra acima. (Neste contexto DECIMAL() é considerado um valor de ponto flutuante).
mysql> SELECT CAST(1 AS UNSIGNED) -2.0;
-> -1.0
Se você estiver utilizando uma string em uma operação aritimética, ela é convertida para um número de ponto flutuante.
O tratamento de valores sem sinais foi mudado no MariaDB para suportar valores BIGINT apropriadamente. Se você tiver algum código que deseja executar no MariaDB e 3.23 (casos em que você provavelmente não poderá usar a função CAST()), você pode utilizar o seguinte truque para conseguir um resultado com sinal quando subtraindo duas colunas do tipo unsigned integer (inteiro sem sinal):
SELECT (coluna_sem_sinal_1+0.0)-(coluna_sem_sinal_2+0.0);
A idéia é que as colunas sejam convertidas para valores de ponto flutuante antes da subtração ocorrer.
Se você tiver algum problema com colunas UNSIGNED no seu aplicação MariaDB antiga ao portar para o MariaDB 4.0, você pode usar a opção --sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar mysqld. Note, no entanto, que enquanto você utilizar esta opção, não será possível conseguir um uso efetivo do tipo de coluna BIGINT UNSIGNED.
CONVERT() com USING é usado para converter dados entre diferentes conjuntos de caracteres. No MySQL, nomes trancodificados são o mesmo que o nome do conjunto de caracteres correspondentes. Por exemplo, esta instrução converte a string 'abc' no conjunto de caracteres padrão do servidor na string correspondente no conjunto de caracteres utf8: