13 Fonctions à utiliser dans les clauses SELECT et WHERE
Manuel de Référence MySQL 4.1 : Version Française
. Opérateurs et fonctions tous types . Les fonctions de contrôle . Fonctions de chaînes de caractères . Fonctions numériques . Fonctions de dates et d'heures . Recherche en texte intégral ( Full-text ) dans MySQL ->Fonctions de transtypage . Autres fonctions . Fonctions et options à utiliser dans les clauses GROUP BY
|
13.7 Fonctions de transtypage
-
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()
. Fonctions de date et heure .
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
.
|