| 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 
 
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
  :
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 : 
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.
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}
 
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);
 | 
 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
  :| 
CREATE TABLE nouvelle_table SELECT CAST('2000-01-01' AS DATE);
 | 
 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.| 
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
 | 
 
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 : 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 .| 
mysql> SELECT CAST(NOW() AS DATE);-> 2003-05-26
 | 
 
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 :
 Si vous utilisez un nombre dans un contexte de chaîne, le nombre sera automatiquement
converti en une chaîne binaire.| 
mysql> SELECT 1+'1';-> 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 toi ",2);->  "salut toi 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 CONCAT("Salut vous ",2);->  "Salut vous 2"
 | 
 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-2 AS UNSIGNED)-> 18446744073709551615
 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
 -> -1
 | 
 Si vous utilisez une chaîne dans une opération arithmétique, elle sera converti en un nombre 
à virgule flottante.| 
mysql> SELECT CAST(1 AS UNSIGNED) -2.0-> -1.0
 | 
 
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é : 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
 .| 
SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);
 | 
 |