Query MySQL per ottenere i nomi delle colonne?


286

Mi piacerebbe ottenere tutti i nomi di col di una tabella mysql in un array in php?

C'è una domanda per questo?

Risposte:


512

Il modo migliore è utilizzare il database virtuale dei metadati INFORMATION_SCHEMA . In particolare la tabella INFORMATION_SCHEMA.COLUMNS ...

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

È MOLTO potente e può darti tonnellate di informazioni senza bisogno di analizzare il testo (come il tipo di colonna, se la colonna è nullable, dimensione massima della colonna, set di caratteri, ecc.) ...

Oh, ed è SQL standard (considerando che SHOW ...è un'estensione specifica di MySQL) ...

Per ulteriori informazioni sulla differenza tra SHOW...e l'utilizzo delle INFORMATION_SCHEMAtabelle, consultare la documentazioneINFORMATION_SCHEMA MySQL su in generale ...


27
È solo SQL standard se non usi quegli stupidi backtick specifici di mysql per citare i nomi delle tabelle. Li odio, fanno sembrare il mio codice sbagliato.
Mark R

17
@MarkR In realtà non li ho inclusi inizialmente quando ho scritto la risposta. Ma poi sembrava solo un muro di scritte nere. Quindi ho aggiunto i back-tick per sfruttare l'evidenziazione della sintassi. Sì, avrei potuto avere anche SET @@SESSION.sql_mode = 'ANSI_QUOTES';prima mano, ma davvero non mi piace. E non ho alcun problema con i back-tick per la delimitazione dell'identificatore. In effetti, mi piacciono meglio delle doppie virgolette (le doppie virgolette mi fanno sentire la domanda sbagliata) ... A ciascuno il suo ...
ircmaxell,

2
Non è affatto necessario citare i nomi delle tabelle nell'esempio sopra.
Mark R

20
@MarkR So che non lo è. Ecco perché ho detto che in realtà non li avevo inclusi inizialmente quando ho scritto la risposta . Li ho aggiunti per sfruttare l'evidenziazione della sintassi ...
ircmaxell,

4
Tieni presente che con le tabelle InnodDB la selezione da information_schema può essere molto lenta. In alcuni server più di un minuto
macjohn

206

È possibile utilizzare la seguente query per MYSQL:

SHOW columns FROM your-table;

Di seguito è riportato il codice di esempio che mostra come implementare la sintassi sopra in php per elencare i nomi delle colonne:

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

Per i dettagli sull'output della SHOW COLUMNS FROM TABLEvisita: MySQL Refrence.


5
Oppure ... DESC TableName;;-)
double_j

Esiste un modo per salvare l'array per ulteriori query? Ti piace cercare $ row [4] nel database per ottenere il valore nella quinta colonna?
user3866044


21

L'ho fatto in passato.

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


7

Utilizzare mysql_fetch_field()per visualizzare tutti i dati di colonna. Vedi il manuale .

$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;
}

"Avviso Questa estensione è obsoleta a partire da PHP 5.5.0 e verrà rimossa in futuro."


2
mysqli_num_fields()e mysqli_fetch_field_direct()sono i metodi aggiornati
Gusstavv Gil

5

Una vecchia funzione PHP "mysql_list_fields ()" è obsoleta. Quindi, oggi il modo migliore per ottenere i nomi dei campi è una query "MOSTRA COLONNE DA table_name [LIKE 'name']". Quindi, ecco un piccolo esempio:

$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

Non sono sicuro se questo è quello che stavi cercando, ma ha funzionato per me:

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

Ciò restituisce un semplice array di nomi di colonne / nomi di variabili nella tabella o nell'array come stringhe, che è ciò di cui avevo bisogno per creare dinamicamente query MySQL. La mia frustrazione era che semplicemente non sapevo indicizzare molto bene gli array in PHP, quindi non ero sicuro di cosa fare con i risultati di DESC o SHOW. Spero che la mia risposta sia utile per i principianti come me!

Per verificare il risultato: print_r($col_names);


4

quando si desidera controllare la struttura di tutta la tabella con alcuni archiviati, utilizzare questo codice. In questa query seleziono nome_colonna, tipo_colonna e nome_tabella per maggiori dettagli. Uso order by column_type in modo da poterlo vedere facilmente.

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

Se vuoi controllare solo il doppio tipo archiviato, puoi farlo facilmente

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;

inserisci qui la descrizione dell'immagine

se si desidera verificare quale campo consente il tipo null ecc., è possibile utilizzare questo

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;

inserisci qui la descrizione dell'immagine

vuoi controllare più quindi anche il link thik ti aiuta.

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


Buona. Molto utile.
Sazzad Hissain Khan,

3

SHOW COLUMNS in mysql 5.1 (non 5.5) utilizza una tabella di dischi temporanea.

Quindi può essere considerato lento in alcuni casi. Almeno, può aumentare il valore del valore Created_tmp_disk_tables . Immagina una tabella di dischi temporanea per connessione o per ogni richiesta di pagina.

SHOW COLUMNS non è poi così lento, forse perché utilizza la cache del file system. Phpmyadmin dice ~ 0,5 ms in modo coerente. Questo non è nulla in confronto ai 500ms-1000ms di servire una pagina wordpress. Tuttavia, ci sono volte che contano. C'è un coinvolgimento del sistema del disco, non si sa mai cosa succede quando il server è occupato, la cache è piena, l'hdd è bloccato ecc.

Il recupero dei nomi delle colonne tramite SELECT * FROM ... LIMIT 1 era di circa 0,1 ms e può utilizzare anche la cache delle query.

Quindi ecco il mio piccolo codice ottimizzato per ottenere i nomi delle colonne da una tabella, senza usare show colonne se possibile:

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;
}

Appunti:

  • Finché la prima riga delle tabelle non contiene un intervallo di dati di megabyte, dovrebbe funzionare correttamente.
  • I nomi delle funzioni db_rows e db_row_ar devono essere sostituiti con la specifica configurazione del database.

Ciao Johan, ricevo un errore: chiamata alla funzione indefinita db_row_ar (), quando eseguo db_columns_ar ('myTableName');
KarlosFontana,

Scusatemi, lo chiarirò nel testo. Era un nome di funzione immaginaria, che indicava qualsiasi cosa la classe del database o l'installazione utilizzi per quel tipo di cose.
Johan,

3

Prova questo io personalmente lo uso:

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

1
perché stai selezionando solo i nomi di colonna "stock_id" e "drug_name"?
Frank Bryce,

ha funzionato per me, ma senza le cose "dove ...". Con DOP: $ this-> dbHandle = new DOP (...); $ query = 'MOSTRA COLONNE DA'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ risultati come $ risultato) {// fai qualcosa con ogni $ risultato}
Zaphoid

2

IN WORDPRESS:

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

2

Questa domanda è vecchia, ma sono arrivato qui alla ricerca di un modo per trovare una determinata query i nomi dei suoi campi in modo dinamico (non necessariamente solo i campi di una tabella). E poiché le persone continuano a indicare questa come la risposta per quel determinato compito in altre domande correlate, sto condividendo il modo in cui ho scoperto che può essere fatto, usando i suggerimenti di 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>";
    }
}

Questo può essere facilmente modificato per inserire i nomi dei campi in un array.

Utilizzando un semplice: $sql="SELECT * FROM myTable LIMIT 1"può darti i campi di qualsiasi tabella, senza la necessità di utilizzare SHOW COLUMNSo alcun modulo php aggiuntivo, se necessario (rimuovendo la parte di dump dei dati).

Spero che questo aiuti qualcun altro.


2

se usi php, usa questa sintesi .

può ottenere informazioni complete sui campi selezionati senza risultato , e tutti i campi personalizzati come:

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

se sopra sql non restituisce dati, otterrà anche i nomi dei campi aname, bname, l'altro nome del campo b

solo due righe:

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

2

Questa query recupera un elenco di tutte le colonne in un database senza dover specificare un nome di tabella. Restituisce un elenco di soli nomi di colonna:

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

Tuttavia, quando ho eseguito questa query in phpmyadmin, ha visualizzato una serie di errori. Tuttavia, ha funzionato. Quindi usalo con cautela.


2

La soluzione più semplice tra tutte le risposte:

DESC `table name`

o

DESCRIBE `table name`

o

SHOW COLUMNS FROM `table name`

2

se hai bisogno solo dei nomi e dei tipi di campo (forse per un facile copia-incolla in Excel):

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

rimuovere

DATA_TYPE='decimal'

se vuoi tutti i tipi di dati


1

non sono un esperto, ma questo funziona per me ..

$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

Ho provato questa query in SQL Server e questo ha funzionato per me:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.