CAST(expr AS type)
,
CONVERT(expr,type)
, CONVERT(expr
USING transcoding_name)
Les fonctions CAST()
et
CONVERT()
peuvent être utilisées pour
convertir une donnée d'un type en un autre. Leurs syntaxes
sont :
La valeur de type
peut être l'une des
suivantes :
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}
CAST()
et CONVERT()
sont
disponibles depuis MySQL 4.0.2. La conversion de type
CHAR
est disponible depuis la version
4.0.6. La forme USING
de
CONVERT()
est disponible depuis la version
4.1.0.
CAST()
et CONVERT(... USING
...)
sont des syntaxes SQL-99. La forme sans
USING
de CONVERT()
est
une syntaxe ODBC.
CONVERT()
avec la clause
USING
sert à convertir des données entre
différent jeux de caractères. Avec MySQL, les noms
d'encodage sont les mêmes que les noms des jeux de
caractères. Par exemple, cette commande converti la chaîne
'abc'
depuis le jeu de caractères par
défaut du serveur vers utf8
:
SELECT CONVERT('abc' USING utf8);
La fonction de transtypage est très pratique lorsque vous voulez
créer une colonne avec un type spécifique dans une requête
CREATE ... SELECT
:
CREATE TABLE nouvelle_table SELECT CAST('2000-01-01' AS DATE);
Les fonctions peuvent aussi être utilisée pour trier des
colonnes de type ENUM
en ordre lexical.
Normalement, le tri sur les colonnes ENUM
est
fait avec les valeurs numériques internes. Pour trier les valeurs
avec l'ordre lexical CHAR
:
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(string AS BINARY)
est l'équivalent de
BINARY string
. CAST(expr AS
CHAR)
traite l'expression comme une chaîne, avec le jeu
de caractères par défaut.
Note : en MySQL 4.0 le
CAST()
en DATE
,
DATETIME
ou TIME
ne fait que
marquer la colonne comme étant du type indiqué, mais n'en change
pas la valeur.
En MySQL 4.1.0, la valeur est convertie dans le type de colonne demandé, puis il est envoyé à l'utilisateur. Cette fonctionnalité est une nouveauté du protocole 4.1, qui envoie les données au client :
mysql> SELECT CAST(NOW() AS DATE);
-> 2003-05-26
Dans les prochaines versions de MySQL (probablement 4.1.2 ou 5.0)
nous allons corriger CAST
pour qu'elle modifie
le résultat si vous l'utilisez comme une partie d'une expression
plus complexe, comme CONCAT("Date: ",CAST(NOW() AS
DATE))
.
N'utilisez pas CAST()
pour extraire des
données dans différents formats, mais utilisez plutôt
LEFT
ou EXTRACT()
. See
Section 12.5, « Fonctions de dates et d'heures ».
Pour transformer une chaîne de caractères en une valeur numérique, vous ne devez rien faire de particulier ; juste utiliser la valeur de la chaîne en lieu et place de la valeur numérique :
mysql> SELECT 1+'1';
-> 2
Si vous utilisez un nombre dans un contexte de chaîne, le nombre sera automatiquement converti en une chaîne binaire.
mysql> SELECT concat("salut toi ",2);
-> "salut toi 2"
Si vous utilisez un nombre dans un contexte de chaîne, le nombre
sera automatiquement converti en chaîne binaire
(BINARY
).
mysql> SELECT CONCAT("Salut vous ",2);
-> "Salut vous 2"
MySQL supporte l'arithmétique avec les valeurs 64 bits signées
et non signées. Si vous utilisez une opération numérique (comme
le signe +
) et qu'un des opérandes est de type
unsigned integer
, alors, le résultat sera une
valeur non signé. Vous pouvez corriger cela en utilisant les
opérateurs de transtypages SIGNED
et
UNSIGNED
, qui transformeront l'opération
respectivement en un entier signé sur 64 bits et un entier non
signé sur 64 bits.
mysql>SELECT CAST(1-2 AS UNSIGNED)
-> 18446744073709551615 mysql>SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
Notez que si l'une ou l'autre opération est une valeur à virgule
flottante (Dans ce contexte, DECIMAL()
est
considéré comme une valeur à virgule flottante) le résultat
devrait être une valeur à virgule flottante et ne sera pas
affecté par la règle ci-dessus.
mysql> SELECT CAST(1 AS UNSIGNED) -2.0
-> -1.0
Si vous utilisez une chaîne dans une opération arithmétique, elle sera converti en un nombre à virgule flottante.
Les fonctions CAST()
et
CONVERT()
ont été ajoutées dans la version
4.0.2 de MySQL.
L'affichage des valeurs non signées a été modifié dans la
version 4.0 de MySQL pour pouvoir supporter correctement les
valeurs de type BIGINT
. Si vous voulez utiliser
du code fonctionnant dans la version 4.0 et la version 3.23 de
MySQL (dans ce cas, vous ne pouvez probablement pas utiliser les
fonctions de transtypage), vous pouvez utiliser l'astuce suivante
pour avoir un résultat signé lorsque vous soustrayez deux
colonnes d'entier non signé :
SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);
L'idée est que les colonnes sont convertis en un point mobile avant de faire la soustraction.
Si vous rencontrez un problème avec les colonnes
UNSIGNED
dans vos anciennes applications MySQL
lorsque vous effectuez le port sous la version 4.0 de MySQL , vous
pouvez utiliser l'option
--sql-mode=NO_UNSIGNED_SUBTRACTION
lorsque vous
lancez mysqld
. Notez cependant qu'aussi
longtemps que vous employez ceci, vous ne serez pas capable
d'utiliser efficacement les colonnes de type UNSIGNED
BIGINT
.
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.