Можно ли получить тип поля из запроса 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)
Я не ищу метаданные в таблице, но в результате запроса. В psql
PostgreSQL 11+ это также возможно, запустив \gdesc
после запроса.
Ответы:
В MySQL вы можете получить эту информацию, создав временную таблицу, а затем используя
DESCRIBE
эту временную таблицу:Мы не можем просто использовать
DESCRIBE
исходную таблицу, потому что столбец, который мы хотим знать, является вычисляемым столбцом, а не чем-то, что непосредственно извлекается из таблицы. Кроме того, мы не можем использоватьDESCRIBE
непосредственно в запросе, потому чтоDESCRIBE
может использоваться только для таблиц. Создание временной таблицы решает обе эти проблемы.источник
Не существует сопоставимого способа передать запрос в MySQL и попросить его вернуть набор результатов, содержащий имена и атрибуты столбцов, которые ваш запрос будет возвращать при его выполнении.
Тем не менее, библиотека, которую вы используете для доступа к MySQL, вероятно, имеет такой механизм, который ваш код мог бы использовать ... потому что в процессе работы MySQL возвращает эту информацию клиентам с каждым выполненным запросом.
Например, библиотека DBD :: mysql в Perl возвращает массивы имен столбцов и типов данных.
Дескриптор выполненного оператора возвращает массив имен столбцов в @ {$ sth -> {NAME}} и массив типов данных столбцов в @ {$ sth -> {mysql_type_name}}. Он получает их из функций, предоставляемых MySQL C API, который (насколько я знаю) является одним и тем же базовым кодом, используемым многими различными языками для своих библиотек MySQL ... поэтому я ожидаю, что подобные структуры будут представлены в других сред.
источник
Я считаю, что эти данные доступны через C API и задокументированы в кодах типов подготовленных операторов C API, но у сервера нет такой возможности предоставить их конечному пользователю,
Для таблицы типов SQL и соответствующего
buffer_type
значения см этой таблицы.Единственный способ обойти это
CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE
источник
Вопрос, который я прочитал, заключается в получении подробной информации о столбцах в наборе результатов, а не о столбцах таблиц базы данных.
Если вы используете PHP, есть встроенные функции для доступа к базам данных с MYSQLI и PDO, которые могут предоставить вам подробную информацию (тип данных и т. Д.) О столбцах в результате запроса (в отличие от столбцов исходных таблиц). ,
Подробнее об этих методах смотрите в документации PHP:
источник