MySQL запрос, чтобы получить имена столбцов?


286

Я хотел бы получить все имена столбцов таблицы MySQL в массиве в PHP?

Есть ли запрос для этого?

Ответы:


514

Лучше всего использовать виртуальную базу метаданных INFORMATION_SCHEMA . В частности, таблица INFORMATION_SCHEMA.COLUMNS ...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

Это ОЧЕНЬ мощный и может дать вам тонны информации без необходимости разбора текста (например, тип столбца, является ли столбец обнуляемым, максимальный размер столбца, набор символов и т. Д.) ...

Да, и это стандартный SQL (тогда как SHOW ...расширение для MySQL) ...

Для получения дополнительной информации о разнице между таблицами SHOW...и их использовании INFORMATION_SCHEMA, ознакомьтесь с документациейINFORMATION_SCHEMA MySQL в целом ...


27
Это только стандартный SQL, если вы не используете эти глупые специфичные для mysql обратные ссылки для цитирования имен таблиц. Я ненавижу их, они заставляют мой код выглядеть неправильно.
MarkR

17
@MarkR Я фактически не включал их изначально, когда писал ответ. Но тогда это выглядело как стена черного письма. Поэтому я добавил галочки, чтобы воспользоваться подсветкой синтаксиса. Да, я мог бы и SET @@SESSION.sql_mode = 'ANSI_QUOTES';раньше, но мне это не нравится. И у меня нет проблем с обратными галочками для разграничения идентификаторов. На самом деле, они мне нравятся больше, чем двойные кавычки (двойные кавычки заставляют запрос чувствовать себя неправильно) ... Каждому свое ...
ircmaxell

2
В приведенном выше примере цитирование имен таблиц не требуется.
MarkR

20
@MarkR Я знаю, что это не так. Вот почему я сказал, что изначально не включал их, когда писал ответ . Я добавил их, чтобы воспользоваться подсветкой синтаксиса ...
ircmaxell

4
Имейте в виду, что с таблицами InnodDB выбор из information_schema может быть очень болезненно медленным. На некоторых серверах больше одной минуты
macjohn

206

Вы можете использовать следующий запрос для MYSQL:

SHOW columns FROM your-table;

Ниже приведен пример кода, который показывает, как реализовать приведенный выше синтаксис в php для перечисления имен столбцов:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

Подробнее о выводе SHOW COLUMNS FROM TABLEвизита: MySQL Refrence.


5
Или ... DESC TableName;;-)
double_j

Есть ли способ сохранить массив для большего количества запросов? Как искать в базе данных $ row [4], чтобы получить значение в пятом столбце?
user3866044


21

Я делал это в прошлом.

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 


7

Используйте mysql_fetch_field()для просмотра всех данных столбца. Смотрите руководство .

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

«Предупреждение Это расширение устарело с PHP 5.5.0 и будет удалено в будущем».


2
mysqli_num_fields()и mysqli_fetch_field_direct()являются обновленными методами
Gusstavv Gil

5

Старая функция PHP «mysql_list_fields ()» устарела. Итак, сегодня лучший способ получить имена полей - это запрос «ПОКАЗАТЬ КОЛОННЫ ИЗ table_name [LIKE 'name']». Итак, вот небольшой пример:

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }

4
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();

4

Не уверен, что это то, что вы искали, но это сработало для меня:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

Это возвращает простой массив имен столбцов / имен переменных в вашей таблице или массиве в виде строк, что мне и было необходимо для динамической сборки запросов MySQL. Мое разочарование было в том, что я просто не знаю, как индексировать массивы в PHP очень хорошо, поэтому я не был уверен, что делать с результатами DESC или SHOW. Надеюсь, мой ответ будет полезен для начинающих, как я!

Чтобы проверить результат: print_r($col_names);


4

если вы хотите проверить всю структуру таблицы с некоторыми полями, используйте этот код. В этом запросе я выбираю column_name, column_type и table_name для более подробной информации. Я использую порядок по column_type, так что я могу видеть это легко.

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

Если вы хотите проверить только двойной тип файла, то вы можете сделать это легко

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

введите описание изображения здесь

если вы хотите проверить, в каком поле разрешен нулевой тип и т.д., вы можете использовать это

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

введите описание изображения здесь

Вы хотите проверить больше, чем эта ссылка также поможет вам.

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html


Хорошо. Очень полезно.
Саззад Хисейн Хан

3

В SHOW COLUMNS в mysql 5.1 (не 5.5) используется временная таблица дисков.

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

SHOW COLUMNS на самом деле не такой медленный, возможно, потому что он использует кеш файловой системы. Phpmyadmin говорит ~ 0,5 мс последовательно. Это ничто по сравнению с 500 мс-1000 мс, обслуживающих страницу WordPress. Но, тем не менее, бывают моменты, когда это важно. Присутствует дисковая система, вы никогда не знаете, что происходит, когда сервер занят, кеш заполнен, жесткий диск остановлен и т. Д.

Извлечение имен столбцов через SELECT * FROM ... LIMIT 1 было около ~ 0,1 мс, и он также может использовать кэш запросов.

Итак, вот мой маленький оптимизированный код для получения имен столбцов из таблицы без использования столбцов show, если это возможно:

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

Ноты:

  • Пока первая строка ваших таблиц не содержит данных в мегабайтах, она должна работать нормально.
  • Имена функций db_rows и db_row_ar должны быть заменены вашей конкретной настройкой базы данных.

Привет, Йохан, я получаю сообщение об ошибке: вызов неопределенной функции db_row_ar (), когда я запускаю db_columns_ar ('myTableName');
КарлосФонтана

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

3

Попробуйте это, я лично использую это:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 

1
почему вы выбираете только имена столбцов "stock_id" и "drug_name"?
Фрэнк Брайс

работал для меня, но без "где ..." вещи. С PDO: $ this-> dbHandle = new PDO (...); $ query = 'ПОКАЗАТЬ КОЛОННЫ ИЗ'. $ TABLENAME; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ results как $ result) {// что-то сделать с каждым $ result}
Zaphoid

2

В ГОРЯЧЕЙ:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}

2

Этот вопрос старый, но я попал сюда в поисках способа найти заданный запрос по его именам полей динамическим образом (не обязательно только по полям таблицы). И поскольку люди продолжают указывать это в качестве ответа на данную задачу в других смежных вопросах, я делюсь тем, как я нашел, что это можно сделать, используя советы Гэвина Симпсона:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

Это может быть легко изменено, чтобы вставить имена полей в массив.

Использование простое: $sql="SELECT * FROM myTable LIMIT 1"может дать вам поля любой таблицы, без необходимости использования SHOW COLUMNSили каких-либо дополнительных модулей PHP, если это необходимо (удаление части дампа данных).

Надеюсь, это поможет кому-то еще.


2

если вы используете php, используйте эту суть .

он может получить поля выбора полной информации без результата , и все пользовательские поля, такие как:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

если выше, sql не возвращает данных, также получит имена полей aname, bname, b's other field name

всего две строчки:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();

2

Этот запрос извлекает список всех столбцов в базе данных без указания имени таблицы. Возвращает список только имен столбцов:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

Однако когда я запустил этот запрос в phpmyadmin, он отобразил ряд ошибок. Тем не менее, это сработало. Так что используйте его с осторожностью.


2

Самое простое решение из всех ответов:

DESC `table name`

или

DESCRIBE `table name`

или

SHOW COLUMNS FROM `table name`

2

если вам нужны только имена и типы полей (возможно, для простого копирования в Excel):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

удалять

DATA_TYPE='decimal'

если вы хотите все типы данных


1

Я не эксперт, но это работает для меня ..

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}

0

Я пробовал этот запрос в SQL Server, и это сработало для меня:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.