MySQL元数据功能来获取查询中的预计列类型?


7

是否可以从MySQL 查询中获取字段类型,就像使用SHOW COLUMNS命令从表中获取字段类型一样?例如来自派生表,

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

给定以上查询,是否存在可以用来获取x类型的函数或东西?PostgreSQL通过系统信息功能使其可用pg_typeof

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

我不是在表上寻找元数据,而是从查询结果中寻找。 随着psqlPostgreSQL的11+,这也可以通过运行\gdesc查询后。


我强烈建议您选择以下答案:dba.stackexchange.com/a/62262/2639(这是在官方客户端中执行此操作的唯一方法)或我自己的dba.stackexchange.com/a/203927/2639(其中解决C API)。从用户的角度来看,仅解决Perl绑定的所选答案似乎不在这里。
埃文·卡洛尔

Answers:


11

在MySQL中,您可以通过创建一个临时表然后DESCRIBE在该临时表上使用来获取此信息:

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

DESCRIBE `temp`;

我们不能仅DESCRIBE在原始表上使用,因为我们想知道其类型的列是计算列,而不是直接从表中提取的列。同样,我们不能DESCRIBE直接在查询上使用,因为DESCRIBE只能在表上使用。创建一个临时表可以解决这两个问题。


这正是我在寻找的东西,谢谢。
院长邱

3

没有一种类似的方法可以将查询传递给MySQL,并要求它返回一个结果集,该结果集包含查询执行时将返回的列的名称和属性。

但是,您用来访问MySQL的库可能具有一种可以让您的代码使用的机制……因为在线上,MySQL确实会在每次执行查询时将该信息返回给客户端。

举例来说,Perl中的DBD :: mysql库返回列名和数据类型的数组。

执行的语句句柄在@ {$ sth-> {NAME}}中返回列名称的数组,在@ {$ sth-> {mysql_type_name}}中返回列数据类型的数组。它是从MySQL C API提供的功能中获得的(据我所知)是许多不同语言为其MySQL库使用的相同的基础代码...因此,我希望类似的结构会在其他程序中公开环境。



0

我相信该数据可通过C API获得,并记录在C API预处理语句类型代码中,但是服务器没有这种能力将其提供给最终用户,

MYSQL_BIND结构的buffer_type成员指示绑定到语句参数或结果集列的C语言变量的数据类型对于输入,buffer_type指示包含要发送到服务器的值的变量的类型。对于输出,它指示将从服务器接收的值存储到的变量类型。

有关SQL类型的表及其相应的buffer_type值,请参见此图表。

唯一的解决方法是 CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

在我阅读本文时,问题是关于获取结果集中各列(而不是数据库表各列)的详细信息。

如果您使用的是PHP,则内置函数可使用MYSQLI和PDO访问数据库,这些函数可以为您提供有关查询结果中的列(与原始表的列相反)的详细信息(数据类型等)。 。

有关这些方法的详细信息,请参见PHP文档:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.