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

197

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

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

Теги:

18 ответов

366
Лучший ответ

Лучший способ - использовать виртуальную базу данных метаданных 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 ознакомьтесь с документацией MySQL на INFORMATION_SCHEMA в целом...

  • 24
    Это только стандартный SQL, если вы не используете эти тупые специфичные для mysql обратные ссылки для цитирования имен таблиц. Я ненавижу их, они заставляют мой код выглядеть неправильно.
  • 15
    @MarkR Я фактически не включил их первоначально, когда я написал ответ. Но тогда это выглядело как стена черного письма. Поэтому я добавил галочки, чтобы воспользоваться подсветкой синтаксиса. Да, у меня может быть SET @@SESSION.sql_mode = 'ANSI_QUOTES'; перед рукой, но мне действительно это не нравится. И у меня нет проблем с обратными галочками для разграничения идентификаторов. На самом деле, они мне нравятся больше, чем двойные кавычки (двойные кавычки заставляют запрос чувствовать себя неправильно) ... Каждому свое ...
Показать ещё 9 комментариев
134

Вы можете использовать следующий запрос для 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; ;-)
  • 0
    Я только что отредактировал, чтобы улучшить и удовлетворить вопрос.
Показать ещё 1 комментарий
32

Кажется, есть 2 способа:

DESCRIBE `tablename`

или

SHOW COLUMNS FROM `tablename`

Подробнее о DESCRIBE здесь: http://dev.mysql.com/doc/refman/5.0/en/describe.html

  • 4
    Аааа, DESCRIBE это просто ярлык для SHOW COLUMNS FROM .
  • 5
    И DESC - даже более короткая рука для DESCRIBE !
13

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

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

Изменить. Сегодня я узнал, как лучше это сделать. См. Ответ ircmaxell.


Разберите вывод SHOW COLUMNS FROM table;

Подробнее об этом здесь: http://dev.mysql.com/doc/refman/5.0/en/show-columns.html

5

Старая функция PHP "mysql_list_fields()" устарела. Итак, сегодня лучшим способом получить имена полей является запрос "SHOW COLUMNS FROM 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; }
5

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

$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 и будет удалено в будущем.

  • 1
    mysqli_num_fields() и mysqli_fetch_field_direct() являются обновленными методами
3
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();
2

когда вы хотите проверить всю структуру таблицы с помощью некоторого файла, используйте этот код. В этом запросе я могу найти имя_каталога, column_type и table_name для более подробной информации. Я использую порядок по столбцу_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;

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

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;

Изображение 801

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

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

  • 0
    Хорошо. Очень полезно.
2

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

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

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

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

2

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

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
  • 1
    почему вы выбираете только имена столбцов "stock_id" и "drug_name"?
  • 0
    работал для меня, но без "где ..." вещи. С PDO: $ this-> dbHandle = new PDO (...); $ query = 'ПОКАЗАТЬ КОЛОННЫ ИЗ'. $ TABLENAME; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ results как $ result) {// что-то сделать с каждым $ result}
2

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

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

SHOW COLUMNS не очень медленный, возможно, потому, что он использует кеш файловой системы. Phpmyadmin говорит ~ 0.5ms последовательно. Это ничто по сравнению с 500 мс-1000 мс на странице wordpress. Но все-таки есть моменты. Существует дисковая система, вы никогда не знаете, что происходит, когда сервер занят, кеш заполнен, hdd застопорился и т.д.

Получение названий столбцов с помощью SELECT * FROM... LIMIT 1 составило около 0,1 мс, и он также может использовать кеш запросов.

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

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 должны быть заменены вашей конкретной настройкой базы данных.
  • 0
    Привет, Йохан, я получаю сообщение об ошибке: вызов неопределенной функции db_row_ar (), когда я запускаю db_columns_ar ('myTableName');
  • 0
    Извините за это, я уточню это в тексте. Это было воображаемое имя функции, обозначающее класс вашей базы данных или настройки, используемые для этого типа вещей.
1

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

DESC `table name`

или

DESCRIBE `table name`

или

SHOW COLUMNS FROM `table name`
1

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

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

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

1

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

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

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

если выше sql не возвращает данные, также будут получать имена полей aname, bname, b другое имя поля

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

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

В WORDPRESS:

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

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

$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

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

//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-модуль, если необходимо (удаление части дампа данных).

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню