Est-il possible d'obtenir le type de champ à partir d'une requête MySQL , de la même manière que vous pouvez l'obtenir à partir d'une table avec la SHOW COLUMNS
commande? Comme à partir d'une table dérivée,
SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
SELECT 1 AS x
UNION SELECT 2
) AS t;
Compte tenu de la requête ci-dessus, existe-t-il une fonction ou quelque chose que je peux utiliser pour obtenir le type de x? PostgreSQL le rend disponible avec les fonctions d'informations systèmepg_typeof
SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
x | pg_typeof
---+-----------
1 | integer
2 | integer
(2 rows)
Je ne cherche pas de métadonnées sur une table, mais à partir du résultat de la requête. Avec psql
PostgreSQL 11+, cela est également possible en exécutant \gdesc
après la requête.
Réponses:
Dans MySQL, vous pouvez obtenir ces informations en créant une table temporaire, puis en utilisant
DESCRIBE
sur cette table temporaire:Nous ne pouvons pas simplement utiliser
DESCRIBE
sur la table d'origine, car la colonne dont nous voulons connaître le type est une colonne calculée, pas quelque chose qui est directement extrait d'une table. De même, nous ne pouvons pas utiliserDESCRIBE
directement sur la requête, carDESCRIBE
ils ne peuvent être utilisés que sur des tables. La création d'une table temporaire résout ces deux problèmes.la source
Il n'y a pas de moyen comparable de transmettre une requête à MySQL et de lui demander de renvoyer un jeu de résultats contenant les noms et les attributs des colonnes que votre requête retournera lors de son exécution.
Cependant, la bibliothèque que vous utilisez pour accéder à MySQL dispose probablement d'un tel mécanisme que votre code pourrait utiliser ... car sur le fil, MySQL renvoie ces informations aux clients à chaque requête exécutée.
À titre d'exemple, la bibliothèque DBD :: mysql en Perl renvoie des tableaux de noms de colonnes et de types de données.
Un descripteur d'instruction exécuté renvoie un tableau des noms de colonne dans @ {$ sth -> {NAME}} et un tableau des types de données de colonne dans @ {$ sth -> {mysql_type_name}}. Il les obtient à partir des fonctions fournies par l'API MySQL C, qui (pour autant que je sache) est le même code sous-jacent utilisé par de nombreux langages différents pour leurs bibliothèques MySQL ... donc je m'attendrais à ce que des structures similaires soient exposées dans d'autres environnements.
la source
Je pense que ces données sont disponibles via l' API C et documentées dans les codes de type de déclaration préparés par l'API C, mais que le serveur n'a pas la capacité de les fournir à l'utilisateur final,
Pour un tableau des types SQL et la
buffer_type
valeur correspondante , voir ce graphique.La seule solution consiste à
CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE
la source
La question, comme je l'ai lu, concerne l'obtention de détails sur les colonnes d'un ensemble de résultats, par opposition aux colonnes des tables de base de données.
Si vous utilisez PHP, il existe des fonctions intégrées pour accéder aux bases de données avec MYSQLI et PDO qui peuvent vous donner des informations détaillées (type de données, etc.) sur les colonnes dans un résultat de requête (par opposition aux colonnes des tables d'origine) .
Pour plus de détails sur ces méthodes, consultez la documentation PHP:
la source