MySQL-Metadatenfunktion zum Abrufen des projizierten Spaltentyps in der Abfrage?


7

Ist es möglich, den Feldtyp aus einer MySQL- Abfrage abzurufen , genauso wie Sie ihn mit dem SHOW COLUMNSBefehl aus einer Tabelle abrufen können? Wie aus einer abgeleiteten Tabelle,

SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
  SELECT 1 AS x
  UNION SELECT 2
) AS t;

Gibt es angesichts der obigen Abfrage eine Funktion oder etwas, mit dem ich den Typ x ermitteln kann? PostgreSQL stellt dies mit den Systeminformationsfunktionen zur Verfügungpg_typeof

SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
 x | pg_typeof 
---+-----------
 1 | integer
 2 | integer
(2 rows)

Ich suche nicht nach Metadaten in einer Tabelle, sondern nach dem Ergebnis der Abfrage. Unter psqlPostgreSQL 11+ ist dies auch möglich, indem \gdescdie Abfrage ausgeführt wird.


Ich würde Ihnen dringend empfehlen, diese Antwort zu wählen: dba.stackexchange.com/a/62262/2639 (dies ist die einzige Möglichkeit, dies innerhalb des offiziellen Clients zu tun) oder meine eigene dba.stackexchange.com/a/203927/2639 (welche adressiert die C-API). Die gewählte Antwort, die nur die Perl-Bindungen aus der Sicht des Benutzers behandelt, scheint hier nicht zum Thema zu gehören.
Evan Carroll

Antworten:


11

In MySQL können Sie diese Informationen abrufen, indem Sie eine temporäre Tabelle erstellen und dann DESCRIBEdiese temporäre Tabelle verwenden:

CREATE TEMPORARY TABLE `temp`
SELECT ...
FROM ...
LIMIT 0;

DESCRIBE `temp`;

Wir können nicht nur DESCRIBEdie ursprüngliche Tabelle verwenden, da die Spalte, deren Typ wir kennen möchten, eine berechnete Spalte ist und nicht direkt aus einer Tabelle gezogen wird. Ebenso können wir nicht DESCRIBEdirekt für die Abfrage verwenden, da DESCRIBEnur für Tabellen verwendet werden kann. Das Erstellen einer temporären Tabelle löst beide Probleme.


Genau das suche ich, danke.
Dean Chiu

3

Es gibt keine vergleichbare Möglichkeit, eine Abfrage an MySQL zu übergeben und eine Ergebnismenge mit den Namen und Attributen der Spalten zurückzugeben, die Ihre Abfrage bei ihrer Ausführung zurückgibt.

Die Bibliothek, mit der Sie auf MySQL zugreifen, verfügt jedoch wahrscheinlich über einen solchen Mechanismus, den Ihr Code verwenden könnte ... da MySQL diese Informationen auf der Leitung bei jeder ausgeführten Abfrage an Clients zurückgibt.

Beispielsweise gibt die DBD :: mysql- Bibliothek in Perl Arrays mit Spaltennamen und Datentypen zurück.

Ein ausgeführtes Anweisungshandle gibt ein Array der Spaltennamen in @ {$ sth -> {NAME}} und ein Array der Spaltendatentypen in @ {$ sth -> {mysql_type_name}} zurück. Diese werden von Funktionen der MySQL C-API bereitgestellt, die (soweit ich weiß) derselbe zugrunde liegende Code ist, der von vielen verschiedenen Sprachen für ihre MySQL-Bibliotheken verwendet wird. Daher würde ich erwarten, dass ähnliche Strukturen in anderen verfügbar gemacht werden Umgebungen.


Perl tippt in die MySQL C API über XS
Evan Carroll

0

Ich glaube, dass diese Daten über die C-API verfügbar und in C API Prepared Statement Type Codes dokumentiert sind, aber dass der Server nicht in der Lage ist, sie dem Endbenutzer bereitzustellen.

Das Element buffer_type von MYSQL_BINDStrukturen gibt den Datentyp der C-Sprachvariablen an, die an einen Anweisungsparameter oder eine Ergebnismengenspalte gebunden ist . Gibt bei der Eingabe buffer_typeden Typ der Variablen an, die den Wert enthält, der an den Server gesendet werden soll. Für die Ausgabe gibt es den Typ der Variablen an, in der ein vom Server empfangener Wert gespeichert werden soll.

Für eine Tabelle der SQL - Typen, und dem entsprechenden buffer_typeWert siehe nachstehende Tabelle.

Die einzige Lösung ist zu CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

Beim Lesen geht es darum, Details zu den Spalten in einer Ergebnismenge abzurufen, im Gegensatz zu den Spalten von Datenbanktabellen.

Wenn Sie PHP verwenden, gibt es integrierte Funktionen für den Zugriff auf Datenbanken mit MYSQLI und PDO, mit denen Sie detaillierte Informationen (Datentyp usw.) zu den Spalten in einem Abfrageergebnis erhalten können (im Gegensatz zu den Spalten der ursprünglichen Tabellen). .

Einzelheiten zu diesen Methoden finden Sie in der PHP-Dokumentation:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.