MySQL查询获取列名?


286

我想将所有mysql表的col名称放入php数组中吗?

是否对此有疑问?

Answers:


511

最好的方法是使用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一般 ...


27
如果您不使用那些愚蠢的特定于MySQL的反引号来引用表名,则这只是标准SQL。我讨厌他们,它们使我的代码看起来不正确。
MarkR

17
@MarkR我实际上在写答案时并没有包括它们。但是后来看起来就像一堵黑色的书写墙。因此,我添加了反引号以利用语法突出显示。是的,我也可以SET @@SESSION.sql_mode = 'ANSI_QUOTES';事先准备,但我真的不喜欢。对于标识符定界,我没有任何问题。实际上,我比双引号更喜欢它们(双引号使查询对我来说是错误的)...对于每个人自己……
ircmaxell 2010年

2
在上面的示例中,根本不需要引用表名。
MarkR 2010年

20
@MarkR我知道不是。这就是为什么我说我在写答案时实际上并没有包括它们。我添加它们以利用语法突出显示...
ircmaxell 2010年

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 2014年

有没有一种方法可以保存数组以进行更多查询?是否想在数据库中搜索$ 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 2016年

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

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;

在此处输入图片说明

您想检查更多,然后thik链接也可以为您提供帮助。

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


好。非常有帮助。
Sazzad Hissain Khan

3

mysql 5.1(非5.5)中的SHOW COLUMNS使用临时磁盘表。

因此在某些情况下可以认为它很慢。至少,它可以提高您的created_tmp_disk_tables值。想象一下,每个连接或每个页面请求一个临时磁盘表。

SHOW COLUMNS并不是真的那么慢,可能是因为它使用了文件系统缓存。Phpmyadmin表示持续约0.5毫秒。与500ms-1000ms投放wordpress页面相比,这算什么。但是,有时仍然很重要。涉及磁盘系统,您永远不知道服务器繁忙,缓存已满,硬盘停止等情况时会发生什么。

通过SELECT * FROM ... LIMIT 1检索列名的时间约为0.1ms,它也可以使用查询缓存。

因此,这是我的一些优化代码,用于从表中获取列名,如果可能的话,不使用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_rowsdb_row_ar应该替换为您特定的数据库设置。

嗨,约翰,我收到错误消息:运行db_columns_ar('myTableName');时,调用未定义函数db_row_ar();
KarlosFontana

抱歉,我将在文字中进行澄清。那是一个虚构的函数名称,代表您的数据库类或设置用于此类事物的任何名称。
约翰,

3

我亲自使用它尝试一下:

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

1
为什么只选择列名“ stock_id”和“ drug_name”?
Frank Bryce 2015年

为我工作,但没有“哪里...”的东西。使用PDO:$ this-> dbHandle = new PDO(...); $ query ='SHOW COLUMNS FROM'。$ tableName; $ stmt = $ this-> dbHandle-> query($ query); $ results = $ stmt-> fetchAll(PDO :: FETCH_ASSOC); foreach($ results作为$ result){//对每个$ result做某事}
Zaphoid 2016年

2

在WordPress中:

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

2

这个问题很老,但是我到这里来的是寻找一种以动态方式找到给定查询的字段名称的方法(不一定只是表的字段)。并且由于人们一直将其作为其他相关问题中给定任务的答案,因此,我将使用加文·辛普森(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模块(如果需要)(删除数据转储部分)。

希望这可以帮助其他人。


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的其他字段名

仅两行:

$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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.