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 MySQL 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 MysQL 4.0 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 MySQL 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 MySQL (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()
.
See Secção 6.3.4, “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 MySQL 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 MySQL 4.0 para
suportar valores BIGINT
apropriadamente. Se
você tiver algum código que deseja executar no MySQL 4.0 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 MySQL antiga ao
portar para o MySQL 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
:
SELECT CONVERT('abc' USING utf8);
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.