Função de metadados do MySQL para obter o tipo de coluna projetada na consulta?


7

É 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 COLUMNScomando? 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 psqlPostgreSQL 11+, isso também é possível executando \gdescapós a consulta.


Eu sugiro que você escolha esta resposta: dba.stackexchange.com/a/62262/2639 (que é a única maneira de fazê-lo no cliente oficial) ou meu próprio dba.stackexchange.com/a/203927/2639 (que aborda a API C). A resposta escolhida, abordando apenas as ligações Perl da perspectiva do usuário, parece fora de tópico aqui.
Evan Carroll

Respostas:


11

No MySQL, você pode obter essas informações criando uma tabela temporária e usando DESCRIBEnessa tabela temporária:

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

DESCRIBE `temp`;

Não podemos usar apenas DESCRIBEna 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 usar DESCRIBEdiretamente na consulta, porque DESCRIBEsó pode ser usado em tabelas. Criar uma tabela temporária resolve esses dois problemas.


É exatamente isso que estou procurando, obrigado.
Dean Chiu

3

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.


Perl está digitando na API C do MySQL através XS
Evan Carroll

0

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,

O membro buffer_type das MYSQL_BINDestruturas indica o tipo de dados da variável da linguagem C vinculada a um parâmetro de instrução ou coluna do conjunto de resultados. Para entrada, buffer_typeindica o tipo da variável que contém o valor a ser enviado ao servidor. Para saída, indica o tipo da variável na qual um valor recebido do servidor deve ser armazenado.

Para uma tabela dos tipos SQL e o buffer_typevalor correspondente, consulte este gráfico.

A única solução é CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

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:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.