É possível obter o tipo de campo de uma consulta MySQL , da mesma maneira que você pode obtê-lo de uma tabela com o SHOW COLUMNS
comando? Como em 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 torna isso disponível 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 por metadados em uma tabela, mas pelo resultado da consulta. Com o psql
PostgreSQL 11+, isso também é possível executando \gdesc
após a consulta.
Respostas:
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 na qual queremos saber o tipo é uma coluna calculada, não algo sendo extraído diretamente de uma tabela. Da mesma forma, não podemos usarDESCRIBE
diretamente na consulta, porqueDESCRIBE
só pode ser usado em tabelas. Criar uma tabela temporária resolve esses dois problemas.fonte
Não existe uma maneira comparável de entregar uma consulta ao MySQL e solicitar 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, na conexão, o MySQL retorna essas informações aos clientes a cada consulta executada.
A título de exemplo, a biblioteca DBD :: mysql no Perl retorna matrizes 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 a matriz dos tipos de dados da coluna em @ {$ sth -> {mysql_type_name}}. Ele obtém esses dados das funções fornecidas pela API C do MySQL, que (tanto quanto eu sei) é o mesmo código subjacente usado por muitas linguagens diferentes para suas bibliotecas MySQL ... então eu esperaria que estruturas semelhantes fossem expostas em outras ambientes.
fonte
Acredito que esses dados estejam disponíveis através da API C e documentados nos Códigos de tipo de instrução preparados da API C, mas que o servidor não tenha essa capacidade de fornecê-los ao usuário final,
Para uma tabela dos tipos SQL e o
buffer_type
valor correspondente, consulte este gráfico.A única solução é
CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE
fonte
A questão, enquanto eu leio, é sobre obter detalhes das colunas em um conjunto de resultados, em oposição às colunas das tabelas do banco de dados.
Se você estiver usando PHP, há 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 da consulta (em oposição às colunas das tabelas originais) .
Para detalhes sobre esses métodos, consulte a documentação do PHP:
fonte