- 1 1. Introduction
- 2 2. Types de conversion de type dans MySQL
- 3 3. Exemples pratiques : conversion des chaînes en nombres
- 4 4. Exemples pratiques : conversion de nombres en chaînes
- 5 5. Cas d’utilisation avancés avec la conversion de type
- 5.1 5.1 Comparaison et conversion de chaînes semblables à des dates
- 5.2 5.2 Tri des types ENUM ou des valeurs de code de manière numérique
- 5.3 5.3 Utilisation dans l’agrégation et le formatage des données
- 5.4 5.4 Prévention des problèmes de précision et de sélection de type
- 5.5 5.5 Détection des erreurs ou des données invalides
- 6 6. Différences entre CAST et CONVERT
- 7 7. Notes importantes et meilleures pratiques
- 8 8. Résumé
- 9 9. FAQ (Questions fréquentes)
- 9.1 Q1. Que se passe-t-il si je CAST une chaîne comme ‘abc’ en nombre ?
- 9.2 Q2. Dois‑je utiliser CAST ou CONVERT ?
- 9.3 Q3. La conversion de type implicite est‑elle suffisante ?
- 9.4 Q4. L’utilisation de la conversion de type dans WHERE ou ORDER BY désactive‑t‑elle les index ?
- 9.5 Q5. La conversion de type est‑elle sûre pour les décimaux ou les grands nombres ?
- 9.6 Q6. Quelle est la différence entre trier comme une chaîne et trier comme un nombre ?
1. Introduction
Lorsque vous exploitez une base de données avec MySQL, vous rencontrerez souvent des situations telles que « les données qui devraient être traitées comme des nombres sont stockées sous forme de chaîne » ou « les calculs et agrégations ne peuvent pas être effectués tant que les données restent une chaîne ». Par exemple, les données importées depuis Excel ou des fichiers CSV sont fréquemment stockées en VARCHAR ou CHAR, même si elles représentent des valeurs numériques. Dans de tels cas, des opérations comme la somme, la moyenne et la comparaison numérique peuvent ne pas fonctionner comme prévu, rendant difficile l’écriture de requêtes SQL correctes.
En revanche, il existe des scénarios où les données numériques doivent être manipulées sous forme de chaînes. Par exemple, lors du remplissage à zéro d’un identifiant ou d’un code, ou lors de la concaténation de données numériques avec d’autres colonnes à des fins d’affichage. Dans de tels cas, il devient nécessaire de convertir les types numériques en types chaîne.
De cette façon, « la conversion de type entre chaînes et nombres » est l’une des compétences fondamentales nécessaires pour manipuler les données de manière flexible dans MySQL. En utilisant la conversion de type de manière appropriée, vous pouvez maintenir l’intégrité des données tout en permettant une agrégation et un traitement flexibles.
Dans cet article, nous expliquerons clairement comment convertir entre chaînes et nombres dans MySQL, comment utiliser ces techniques efficacement, ainsi que les pièges courants et les meilleures pratiques basées sur l’expérience du terrain. Que vous soyez débutant ou développeur SQL expérimenté, ce guide vous apportera une valeur pratique.
2. Types de conversion de type dans MySQL
MySQL offre plusieurs fonctionnalités pratiques pour convertir les types de données. Dans cette section, nous expliquerons deux grands schémas : « conversion de type explicite » et « conversion de type implicite », ainsi que leurs méthodes représentatives.
2.1 Conversion de type explicite
La conversion de type explicite consiste à spécifier clairement dans SQL que « cette valeur doit être convertie en un type spécifique ». Les deux fonctions suivantes sont couramment utilisées.
Fonction CAST
CAST() est une fonction SQL standard qui convertit une valeur en un type spécifié. Elle est largement utilisée dans MySQL.
SELECT CAST('123' AS SIGNED);
Dans cet exemple, la chaîne '123' est convertie en entier signé (SIGNED). D’autres types convertibles incluent UNSIGNED (entier non signé), DECIMAL (nombre à virgule fixe), CHAR (chaîne) et DATE (date).
Fonction CONVERT
CONVERT() est une autre fonction utilisée pour convertir des valeurs en différents types de données. La syntaxe est la suivante.
SELECT CONVERT('456', UNSIGNED);
Dans cet exemple, la chaîne '456' est convertie en entier non signé (UNSIGNED). La principale différence avec CAST() est que CONVERT() peut également être utilisé pour la conversion de jeu de caractères.
2.2 Conversion de type implicite
La conversion de type implicite est un mécanisme où MySQL convertit automatiquement les types de données lors de l’exécution d’opérations ou de comparaisons.
Par exemple, lors de l’addition d’un nombre et d’une chaîne, MySQL convertit automatiquement la chaîne en valeur numérique.
SELECT 1 + '2';
-- Result: 3
De même, lors de la concaténation de valeurs numériques en tant que chaînes :
SELECT CONCAT(10, ' apples');
-- Result: '10 apples'
La conversion de type implicite est pratique, mais elle peut produire des résultats inattendus. Par conséquent, pour une logique complexe ou des processus critiques, l’utilisation de conversion de type explicite est fortement recommandée.
3. Exemples pratiques : conversion des chaînes en nombres
Dans MySQL, lorsque des valeurs numériques sont stockées sous forme de chaînes (comme CHAR ou VARCHAR), vous ne pouvez pas effectuer de calculs ou de comparaisons numériques de manière fiable tel quel. Pour agréger et analyser correctement ces données, il faut convertir les chaînes en types numériques. Cette section présente les méthodes de conversion les plus courantes et les précautions essentielles.
3.1 Conversion avec la fonction CAST
L’approche la plus basique consiste à utiliser la fonction CAST(). Par exemple, pour convertir la chaîne '100' en entier, écrivez ce qui suit :
SELECT CAST('100' AS SIGNED) AS numeric_result;
-- Result: 100 (integer)
Utilisez SIGNED pour les entiers signés et UNSIGNED pour les entiers non signés. Pour les données décimales, vous pouvez également utiliser DECIMAL ou FLOAT.
SELECT CAST('123.45' AS DECIMAL(10,2)) AS decimal_result;
-- Result: 123.45
3.2 Conversion avec la fonction CONVERT
La fonction CONVERT() peut être utilisée de presque la même manière :
SELECT CONVERT('200', SIGNED) AS converted_result;
-- Result: 200
Les deux produisent le même résultat, mais comme CAST() est du SQL standard et offre une meilleure portabilité, il est généralement recommandé en cas de doute.
3.3 Conversion implicite via l’arithmétique
Lorsque vous effectuez des opérations arithmétiques avec des types numériques et des chaînes dans des expressions SQL, MySQL convertit automatiquement la chaîne en nombre. Par exemple :
SELECT '50' + 25 AS total;
-- Result: 75
Vous pouvez également appliquer ce comportement aux fonctions d’agrégation. Par exemple, si vous passez une colonne de type chaîne à SUM(), MySQL tente automatiquement une conversion numérique et additionne les valeurs :
SELECT SUM(amount) FROM sales_data;
-- Even if the amount column is VARCHAR, MySQL will attempt numeric summation
3.4 Faites attention aux chaînes à remplissage zéro et aux valeurs non numériques
Les chaînes à remplissage zéro (par ex., '000100') peuvent également être converties en nombres :
SELECT CAST('000100' AS SIGNED) AS converted_result;
-- Result: 100
Cependant, soyez prudent si la chaîne contient des caractères non numériques. Si vous convertissez quelque chose comme CAST('abc123' AS SIGNED), et qu’il n’y a aucun caractère numérique au début, MySQL renvoie 0. Selon la qualité des données, il est important d’effectuer une validation des entrées avant la conversion.
3.5 Cas d’utilisation courants dans le monde réel
- Agréger les ventes ou les montants qui sont devenus des chaînes à cause d’importations Excel/CSV
- Trier les ID stockés comme des chaînes (même s’ils représentent des nombres) dans l’ordre numérique
- Trier les chaînes de dates stockées au format
YYYYMMDDpar ordre de date (expliqué plus tard)
4. Exemples pratiques : conversion de nombres en chaînes
Dans MySQL, il existe de nombreux cas où vous souhaitez traiter des données numériques comme des chaînes. Les exemples typiques incluent l’affichage d’ID ou de codes avec remplissage zéro, ou la création de messages en concaténant des valeurs numériques avec d’autres textes. Cette section présente des méthodes représentatives et des cas d’utilisation pratiques.
4.1 Conversion avec la fonction CAST
Pour convertir explicitement un type numérique (tel que INT ou DECIMAL) en type chaîne, utilisez CAST() :
SELECT CAST(123 AS CHAR) AS string_result;
-- Result: '123'
Avec cette méthode, vous pouvez facilement concaténer des colonnes numériques avec d’autres chaînes.
4.2 Conversion avec la fonction CONVERT
Vous pouvez également faire la même chose avec CONVERT() :
SELECT CONVERT(456, CHAR) AS converted_result;
-- Result: '456'
Il y a peu de différence avec CAST(), mais du point de vue du SQL standard, CAST() est légèrement préféré.
4.3 Conversion implicite via concaténation
Lors de la concaténation de nombres et de chaînes à l’aide de fonctions comme CONCAT(), MySQL convertit automatiquement les nombres en chaînes.
SELECT CONCAT(2024, ' year') AS fiscal_year_display;
-- Result: '2024 year'
Cette conversion implicite est couramment utilisée pour la génération de rapports de routine et le formatage des données.
4.4 Cas d’utilisation courants dans le monde réel
- Génération d’ID à remplissage zéro Pour afficher un ID numérique sur 5 chiffres, combinez-le avec
LPAD()comme suit :SELECT LPAD(CAST(id AS CHAR), 5, '0') AS zero_padded_id FROM users; -- Si id=7, le résultat est '00007' - Concaténation de dates ou de montants en chaînes
SELECT CONCAT('The total amount is ', CAST(total AS CHAR), ' yen.') AS message FROM orders; -- Si total=1500, le résultat est 'The total amount is 1500 yen.'
4.5 Remarques
Même si la chaîne convertie apparaît visuellement identique, le comportement du « tri » et des « opérations de comparaison » change.
Par exemple, lors d’un tri en tant que chaînes, '20' peut apparaître avant '100' (ordre lexicographique). Il est important de choisir l’approche en fonction de votre objectif.
5. Cas d’utilisation avancés avec la conversion de type
La conversion de type n’est pas limitée à de simples transformations numériques ou de chaînes. Elle peut également être appliquée dans divers scénarios pratiques dans des systèmes réels. Cette section présente des cas avancés couramment utilisés et leurs considérations clés.
5.1 Comparaison et conversion de chaînes semblables à des dates
Si votre base de données stocke les dates au format YYYYMMDD sous forme de types numériques ou de chaînes, une simple comparaison de chaînes peut ne pas toujours se comporter comme attendu.
Dans de tels cas, convertir la valeur en type numérique à l’aide de CAST() permet un tri et une comparaison chronologiques appropriés.
SELECT *
FROM events
ORDER BY CAST(event_date AS UNSIGNED);
-- Values such as '20240501', '20240502', etc. are sorted in date order
Vous pouvez également combiner cela avec la fonction REPLACE() pour convertir des dates séparées par des tirets comme '2024-05-01' en entiers.
SELECT CAST(REPLACE('2024-05-01', '-', '') AS UNSIGNED);
-- Result: 20240501
5.2 Tri des types ENUM ou des valeurs de code de manière numérique
Pour les types ENUM ou les valeurs de code qui représentent une signification numérique, vous pourriez vouloir les trier par ordre numérique plutôt que par ordre lexicographique. En les convertissant en types numériques avec CAST() avant le tri, vous obtenez un ordre intuitif.
SELECT *
FROM products
ORDER BY CAST(product_code AS UNSIGNED);
5.3 Utilisation dans l’agrégation et le formatage des données
Par exemple, si les montants de vente sont stockés sous forme de VARCHAR, vous pouvez obtenir un total précis en les convertissant explicitement à l’intérieur de SUM().
SELECT SUM(CAST(sales_amount AS SIGNED)) AS total_sales
FROM sales_data;

5.4 Prévention des problèmes de précision et de sélection de type
Pour les valeurs décimales ou numériques importantes, la conversion en type DECIMAL aide à préserver la précision.
Le choix entre SIGNED et UNSIGNED est également important, en fonction de la présence possible de valeurs négatives dans vos données.
SELECT CAST('1234.567' AS DECIMAL(10, 3));
-- Result: 1234.567
5.5 Détection des erreurs ou des données invalides
Si la conversion aboutit à des valeurs NULL ou 0 inattendues, cela peut indiquer des données invalides.
Par exemple, si une chaîne ne peut pas être convertie en nombre, CAST() peut retourner 0 ou NULL en fonction du mode SQL.
Dans de tels cas, vérifier les résultats de conversion peut aider à identifier les besoins en nettoyage ou en validation des données.
SELECT original, CAST(original AS SIGNED) AS converted
FROM test_data
WHERE CAST(original AS SIGNED) = 0 AND original <> '0';
-- Extract only data that cannot be properly converted to numeric values
6. Différences entre CAST et CONVERT
Lors de la conversion de type dans MySQL, vous utilisez généralement soit la fonction CAST soit la fonction CONVERT. Bien qu’elles paraissent similaires, il existe des différences dans leur utilisation et leurs caractéristiques. Cette section explique ces différences et comment choisir entre elles.
6.1 Différences de base
- Fonction CAST Utilise la syntaxe
CAST(value AS type)pour convertir explicitement une valeur vers le type spécifié. Elle est définie dans le SQL standard et fonctionne de manière similaire dans de nombreux systèmes de bases de données.SELECT CAST('123' AS SIGNED); - Fonction CONVERT Utilise la syntaxe
CONVERT(value, type)pour convertir une valeur vers le type spécifié. Dans MySQL, elle peut également être utilisée pour la conversion d’ensemble de caractères.SELECT CONVERT('123', SIGNED); -- Conversion de type SELECT CONVERT('hello' USING utf8mb4); -- Conversion d'ensemble de caractères
6.2 Compatibilité avec le SQL standard
Puisque CAST fait partie de la norme SQL internationale, elle offre une meilleure portabilité vers d’autres bases de données (telles que PostgreSQL, SQL Server et Oracle). D’un autre côté, CONVERT inclut des extensions spécifiques à MySQL, en particulier pour la conversion d’ensemble de caractères, en utilisant une syntaxe comme CONVERT(expr USING charset_name).
6.3 Comment choisir entre elles
- Pour la conversion de type (nombres, chaînes, dates, etc.) Dans la plupart des cas, l’utilisation de
CASTest le choix le plus sûr. C’est du SQL standard, très portable, et adapté aux futures migrations de bases de données. - Pour la conversion de jeu de caractères (par ex., sjis vers utf8mb4) Vous devez utiliser
CONVERT(expr USING charset_name). - Pour les cas spécifiques à MySQL ou particuliers
CONVERTpeut offrir une flexibilité supplémentaire, mais pour les usages généraux, commencez parCASTet n’utilisezCONVERTque lorsque c’est nécessaire.
6.4 Comparaison d’exemple
-- Type conversion using CAST (convert to integer)
SELECT CAST('456' AS SIGNED);
-- Type conversion using CONVERT
SELECT CONVERT('456', SIGNED);
-- Character set conversion using CONVERT
SELECT CONVERT('Hello' USING utf8mb4);
6.5 Notes importantes
- Si la conversion échoue, les deux fonctions peuvent renvoyer
NULLou0. - La conversion de jeu de caractères ne peut pas être effectuée avec
CAST. - Le comportement peut différer selon le mode SQL ou la version de MySQL, il faut donc toujours tester à la fois en environnement de développement et de production.
7. Notes importantes et meilleures pratiques
Lors de l’utilisation de la conversion de type chaîne et numérique dans MySQL, plusieurs pièges potentiels doivent être pris en compte. Cette section présente les meilleures pratiques pour aider à prévenir les problèmes et garantir une utilisation sûre et précise.
7.1 Erreurs ou NULL/0 inattendu·e·s provenant de conversions invalides
Lors d’une conversion de type, si la valeur source n’est pas dans le bon format, MySQL peut renvoyer des valeurs NULL ou 0 inattendues.
SELECT CAST('abc' AS SIGNED) AS result;
-- Result: 0 (default MySQL behavior)
Comme indiqué ci-dessus, convertir une chaîne non numérique en type numérique donne 0. Par conséquent, vérifiez toujours que les données d’origine ne contiennent pas de valeurs invalides avant la conversion.
Selon les paramètres du mode SQL, la conversion peut plutôt produire une erreur ou NULL. Confirmez toujours la configuration de votre environnement de production.
7.2 Choisir la précision et les types signé/sans signe
- Pour les valeurs contenant des décimales, convertissez en
DECIMALouFLOAT - Si des valeurs négatives sont possibles, utilisez
SIGNED; si les valeurs sont strictement des entiers positifs, utilisezUNSIGNED
Sélectionnez toujours le type approprié en fonction des caractéristiques de vos données.
7.3 Impact sur les index
L’utilisation de fonctions de conversion de type comme CAST ou CONVERT dans les clauses WHERE ou ORDER BY peut empêcher l’utilisation des index, entraînant une dégradation des performances.
SELECT * FROM users WHERE CAST(user_id AS SIGNED) = 1000;
-- Even if user_id has an index, it is often not used
Pour les grands ensembles de données ou les requêtes critiques en termes de performances, il est préférable d’unifier les types de colonnes dans la conception du schéma afin d’éviter les conversions inutiles.
7.4 Ne pas trop compter sur la conversion implicite
La conversion de type implicite dans MySQL est pratique, mais elle peut entraîner un comportement inattendu. Pour une logique importante, utilisez toujours CAST ou CONVERT de manière explicite.
SELECT '100a' + 20;
-- Result: 100 (only the leading numeric portion is used)
Pour éviter les bugs subtils et les incohérences de données, faites de la conversion explicite une habitude.
7.5 Valider les types à l’étape d’entrée des données
Lors de la conception de votre base de données, stockez les données numériques en tant que types numériques et les données textuelles en tant que types texte. Minimiser le besoin de conversion grâce à une conception de schéma appropriée est l’une des méthodes les plus efficaces pour prévenir les problèmes.
8. Résumé
La conversion de type entre chaînes et nombres dans MySQL est un sujet incontournable dans le traitement quotidien des données, l’agrégation et les opérations système. Dans cet article, nous avons couvert tout, des utilisations de base aux techniques avancées et aux précautions importantes.
Pour la conversion chaîne‑vers‑nombre, des méthodes explicites comme CAST et CONVERT sont disponibles. Bien que la conversion implicite soit fréquemment utilisée en pratique, privilégier la conversion explicite améliore la fiabilité et la qualité des données. Inversement, la conversion nombre‑vers‑chaîne est également largement utilisée pour formater des ID, des codes et générer des messages de sortie.
En outre, des techniques telles que les applications liées aux dates, l’agrégation et le tri, et la détection d’erreurs démontrent à quel point la conversion de type peut être puissante dans des scénarios réels. Cependant, la conversion comporte également des pièges potentiels et des impacts sur les performances. Suivez toujours les meilleures pratiques discutées ci‑dessus.
En maîtrisant correctement la conversion de type, vous pouvez considérablement élargir votre capacité à manipuler les données efficacement dans MySQL.
Nous espérons que cet article soutient votre travail quotidien et votre apprentissage.
9. FAQ (Questions fréquentes)
Q1. Que se passe-t-il si je CAST une chaîne comme ‘abc’ en nombre ?
Dans MySQL, lorsqu’on tente de convertir une chaîne en type numérique (tel que SIGNED ou UNSIGNED), MySQL renvoie la partie numérique initiale si elle est présente ; sinon, il renvoie 0.
SELECT CAST('abc' AS SIGNED); -- Result: 0
SELECT CAST('123abc' AS SIGNED); -- Result: 123
Cependant, selon le mode SQL (par exemple, STRICT_TRANS_TABLES), le résultat peut être une erreur ou NULL.
Q2. Dois‑je utiliser CAST ou CONVERT ?
Pour la conversion de type générale (nombres, chaînes, dates, etc.), l’utilisation de CAST est recommandée car elle respecte la norme SQL. Pour la conversion de jeu de caractères, vous devez utiliser la fonction CONVERT avec la clause USING. Choisissez en fonction de votre cas d’utilisation.
Q3. La conversion de type implicite est‑elle suffisante ?
La conversion implicite peut fonctionner pour de petites requêtes ou des tests, mais pour l’agrégation critique et le développement de systèmes de production, la conversion explicite (CAST ou CONVERT) est fortement recommandée. Écrire des conversions explicites aide à prévenir les comportements inattendus et les bugs.
Q4. L’utilisation de la conversion de type dans WHERE ou ORDER BY désactive‑t‑elle les index ?
Oui. Appliquer des fonctions telles que CAST ou CONVERT à une colonne peut empêcher MySQL d’utiliser les index définis sur cette colonne.
Si des requêtes à haute performance sur de grands ensembles de données sont requises, unifiez les types de colonnes à l’avance ou envisagez d’utiliser des sous‑requêtes ou des colonnes générées.
Q5. La conversion de type est‑elle sûre pour les décimaux ou les grands nombres ?
L’utilisation de DECIMAL ou FLOAT peut préserver la précision, mais des erreurs d’arrondi, une perte de précision ou une troncature peuvent tout de même se produire. Spécifiez toujours une précision et une échelle suffisantes pour vos besoins.
Q6. Quelle est la différence entre trier comme une chaîne et trier comme un nombre ?
Lorsqu’on trie comme des chaînes, des valeurs comme '10' peuvent apparaître avant '2' en raison de l’ordre lexicographique. Si vous souhaitez un ordre numérique, effectuez toujours la conversion de type avant le tri.


