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:
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {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
: