Je suis tombé récemment sur deux comportements de la fonction MySQL CONCAT qui m’ont posé des soucis d’encodage et de valeurs nulles. Voici un descriptif des problèmes rencontrés avec leurs solutions et explications.

mysql_logoJ’utilise quotidiennement dans le cadre de mon travail les fonctions, les procédures stockées, les triggers et les event MySQL. Dans ce cadre, j’ai rencontré quelques soucis avec la fonction CONCAT. Après quelques recherches sur le net, j’ai vu que le comportement en question était normal et j’ai eu l’explication du pourquoi du comment. Je vous livre ici ces solutions et explications pour le cas où vous rencontriez les mêmes soucis.

Problème de valeurs NULL avec CONCAT

Un des points qui m’a souvent fait pester quand j’ai eu à utiliser la fonction CONCAT MySQL est le fait qu’il suffit qu’il y ait une valeur NULL dans le lot pour que toute la chaîne devienne NULL. Il faut ensuite arriver à savoir au milieu de tous les champs et toutes les variables impliqués lequel est fautif. Pas toujours facile en fonction du nombre de paramètres.
J’ai trouvé récemment sur ce site une astuce en utilisant la fonction CONCAT_WS avec comme séparateur la chaîne vide  ». La fonction CONCAT_WS (pour With Separator) ajoute automatiquement entre chaque paramètre de la fonction un séparateur (défini comme premier paramètre). Cette fonction a aussi l’avantage d’ignorer les valeurs nulles.

Problème d’encodage avec CONCAT

J’ai rencontré un problème d’encodage récemment avec la fonction CONCAT. Les champs en entrée et en sortie était pourtant bien du même jeu de caractères (latin1, à migrer un jour en Utf8 ndlr), mais en sortie mes accents apparaissait avec un point d’interrogation. En faisant quelques tests avec la fonction CHARSET, je me suis aperçu qu’à partir du moment où j’avais un numérique dans ma concaténation, mon jeu de caractère en sortie de CONCAT était « binary » et plus latin1 (voir copie d’écran ci-dessous). Le comportement est normal et documenté après lecture du site MySQL. Une des solutions dans ce cas est de passer par un CAST (voir copie d’écran ci-dessous).

concat mysql