Функция метаданных MySQL для получения проецируемого типа столбца в запросе?

7

Можно ли получить тип поля из запроса MySQL так же, как вы можете получить его из таблицы с помощью SHOW COLUMNSкоманды? Например, из производной таблицы,

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

Учитывая приведенный выше запрос, есть ли функция или что-то, что я могу использовать, чтобы получить тип х? 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 (который обращается к API C). Выбранный ответ, касающийся только привязок Perl с точки зрения пользователя, кажется здесь не по теме.
Эван Кэрролл

Ответы:

11

В MySQL вы можете получить эту информацию, создав временную таблицу, а затем используя DESCRIBEэту временную таблицу:

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

DESCRIBE `temp`;

Мы не можем просто использовать DESCRIBEисходную таблицу, потому что столбец, который мы хотим знать, является вычисляемым столбцом, а не чем-то, что непосредственно извлекается из таблицы. Кроме того, мы не можем использовать DESCRIBEнепосредственно в запросе, потому что DESCRIBEможет использоваться только для таблиц. Создание временной таблицы решает обе эти проблемы.

Brilliand
источник
Это именно то, что я ищу, спасибо.
Дин Чиу
3

Не существует сопоставимого способа передать запрос в MySQL и попросить его вернуть набор результатов, содержащий имена и атрибуты столбцов, которые ваш запрос будет возвращать при его выполнении.

Тем не менее, библиотека, которую вы используете для доступа к MySQL, вероятно, имеет такой механизм, который ваш код мог бы использовать ... потому что в процессе работы MySQL возвращает эту информацию клиентам с каждым выполненным запросом.

Например, библиотека DBD :: mysql в Perl возвращает массивы имен столбцов и типов данных.

Дескриптор выполненного оператора возвращает массив имен столбцов в @ {$ sth -> {NAME}} и массив типов данных столбцов в @ {$ sth -> {mysql_type_name}}. Он получает их из функций, предоставляемых MySQL C API, который (насколько я знаю) является одним и тем же базовым кодом, используемым многими различными языками для своих библиотек MySQL ... поэтому я ожидаю, что подобные структуры будут представлены в других сред.

Майкл - sqlbot
источник
Perl вводит в MySQL C API через XS
Эван Кэрролл,
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:

vidona
источник