É possível obter o tipo de campo de uma consulta MySQL , da mesma forma que você pode obtê-lo de uma tabela com o SHOW COLUMNS
comando? Como de uma tabela derivada,
SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
SELECT 1 AS x
UNION SELECT 2
) AS t;
Dada a consulta acima, existe uma função ou algo que eu possa usar para obter o tipo de x? O PostgreSQL disponibiliza isso com as funções de informações do sistemapg_typeof
SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
x | pg_typeof
---+-----------
1 | integer
2 | integer
(2 rows)
Não estou procurando metadados em uma tabela, mas a partir do resultado da consulta. No psql
PostgreSQL 11+, isso também é possível executando \gdesc
após a consulta.
No MySQL, você pode obter essas informações criando uma tabela temporária e usando
DESCRIBE
nessa tabela temporária:Não podemos usar apenas
DESCRIBE
na tabela original porque a coluna cujo tipo queremos saber é uma coluna calculada, e não algo extraído diretamente de uma tabela. Da mesma forma, não podemos usarDESCRIBE
diretamente na consulta, poisDESCRIBE
só pode ser usado em tabelas. A criação de uma tabela temporária resolve esses dois problemas.Não há uma maneira comparável de entregar uma consulta ao MySQL e pedir que ele retorne um conjunto de resultados contendo os nomes e atributos das colunas que sua consulta retornará quando for executada.
No entanto, a biblioteca que você está usando para acessar o MySQL provavelmente possui um mecanismo que seu código poderia usar... porque, durante a conexão, o MySQL retorna essas informações aos clientes a cada consulta executada.
A título de exemplo, a biblioteca DBD::mysql em Perl retorna arrays de nomes de colunas e tipos de dados.
Um identificador de instrução executado retorna uma matriz dos nomes das colunas em @{$sth->{NAME}} e uma matriz dos tipos de dados da coluna em @{$sth->{mysql_type_name}}. Ele obtém isso de funções fornecidas pela API MySQL C, que (até onde eu sei) é o mesmo código subjacente usado por várias linguagens diferentes para suas bibliotecas MySQL ... então eu esperaria que estruturas semelhantes fossem expostas em outros ambientes.
Acredito que esses dados estejam disponíveis por meio da API C e documentados nos códigos de tipo de declaração preparados pela API C , mas que o servidor não tem essa capacidade de fornecê-los ao usuário final,
Para obter uma tabela dos tipos de SQL e o
buffer_type
valor correspondente, consulte este gráfico.O único trabalho ao redor é
CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE
A questão, conforme li, é obter detalhes sobre as colunas em um conjunto de resultados, em oposição às colunas das tabelas do banco de dados.
Se você estiver usando PHP, existem funções internas para acessar bancos de dados com MYSQLI e PDO que podem fornecer informações detalhadas (tipo de dados e assim por diante) sobre as colunas em um resultado de consulta (em oposição às colunas das tabelas originais) .
Para obter detalhes sobre esses métodos, consulte a documentação do PHP: