MySQL查询以获取列名?

Posted

技术标签:

【中文标题】MySQL查询以获取列名?【英文标题】:MySQL query to get column names? 【发布时间】:2011-05-09 02:08:22 【问题描述】:

我想把一个 mysql 表的所有 col 名称放到 php 中的一个数组中?

有这个查询吗?

【问题讨论】:

【参考方案1】:

最好的方法是使用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 Documentation on INFORMATION_SCHEMA in general...

【讨论】:

如果您不使用那些愚蠢的 mysql 特定反引号来引用表名,这只是标准 SQL。我讨厌他们,他们让我的代码看起来不对。 @MarkR 实际上,当我写答案时,我最初并没有包括它们。但后来它看起来就像一堵黑色的文字墙。所以我添加了反引号以利用语法突出显示。是的,我也可以事先拥有SET @@SESSION.sql_mode = 'ANSI_QUOTES';,但我真的不喜欢那样。而且我对标识符定界的反引号没有任何问题。事实上,我比双引号更喜欢它们(双引号让我觉得查询不对)......对每个人来说...... 在上面的例子中根本不需要引用表名。 @MarkR 我知道不是。这就是为什么我说我在写答案时实际上并没有包括它们。我添加它们以利用语法突出显示... 请注意,使用 InnodDB 表从 information_schema 中选择可能会非常缓慢。在某些服务器上超过一分钟【参考方案2】:

您可以对 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.

【讨论】:

或者...DESC TableName; ;-)【参考方案3】:

似乎有两种方法:

DESCRIBE `tablename`

SHOW COLUMNS FROM `tablename`

更多关于DESCRIBE这里:http://dev.mysql.com/doc/refman/5.0/en/describe.html

【讨论】:

啊,DESCRIBE 只是SHOW COLUMNS FROM 的快捷方式。 DESC 甚至更短于DESCRIBE 是的@SurrealDreams 但与DESCRIBE 不能与WHERE 一起使用。例如:SHOW COLUMNS FROM acct__order WHERE ``Key`` = 'PRI'; 获取表的主键不适用于DESCRIBE【参考方案4】:

我过去也这样做过。

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

【讨论】:

【参考方案5】:

编辑:今天我学到了更好的方法。请参阅 ircmaxell 的回答。


解析SHOW COLUMNS FROM table;的输出

这里有更多关于它的信息:http://dev.mysql.com/doc/refman/5.0/en/show-columns.html

【讨论】:

【参考方案6】:

使用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 起已弃用,将来将被删除。”

【讨论】:

mysqli_num_fields()mysqli_fetch_field_direct() 是更新后的方法【参考方案7】:

所有答案中最简单的解决方案:

DESC `table name`

DESCRIBE `table name`

SHOW COLUMNS FROM `table name`

【讨论】:

【参考方案8】:

不推荐使用旧的 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; 

【讨论】:

【参考方案9】:

当你想检查你所有的表结构和一些文件时,请使用这个代码。在此查询中,我选择 column_name、column_type 和 table_name 以获取更多详细信息。我按 column_type 使用 order,所以我可以很容易地看到它。

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

【讨论】:

好。很有帮助。【参考方案10】:
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();

【讨论】:

【参考方案11】:

不确定这是否是您要找的,但这对我有用:

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

这会以字符串形式返回表或数组中的列名/变量名的简单数组,这是我动态构建 MySQL 查询所需要的。我的沮丧是我根本不知道如何在 PHP 中很好地索引数组,所以我不确定如何处理 DESC 或 SHOW 的结果。希望我的回答对像我这样的初学者有所帮助!

查看结果:print_r($col_names);

【讨论】:

【参考方案12】:

SHOW COLUMNS 在 mysql 5.1(不是 5.5)中使用临时磁盘表。

http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html http://dev.mysql.com/doc/refman/5.1/en/show-columns.html

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

SHOW COLUMNS 并没有那么慢,可能是因为它使用了文件系统缓存。 Phpmyadmin 一直说 ~0.5ms。与提供一个 wordpress 页面的 500 毫秒到 1000 毫秒相比,这算不了什么。但是,有时它很重要。有磁盘系统参与,你永远不知道当服务器繁忙、缓存已满、硬盘停止等时会发生什么。

通过 SELECT * FROM ... LIMIT 1 检索列名大约需要 0.1 毫秒,并且它也可以使用查询缓存。

所以这是我的小优化代码,用于从表中获取列名,如果可能,不使用 show columns

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 应替换为您的特定数据库设置。

【讨论】:

嗨 Johan,我收到错误:调用未定义函数 db_​​row_ar(),当我运行 db_columns_ar('myTableName'); 对不起,我会用文字说明。那是一个虚构的函数名称,代表您的数据库类或设置用于该类型事物的任何内容。【参考方案13】:

在 WORDPRESS 中:

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

【讨论】:

【参考方案14】:

试试这个我个人用的:

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

【讨论】:

为什么只选择列名“stock_id”和“drug_name”? 为我工作,但没有“哪里......”的东西。使用 PDO: $this->dbHandle = new PDO(...); $query = '显示来自的列' 。 $表名; $stmt = $this->dbHandle->query($query); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $result) //对每个 $result 做一些事情 【参考方案15】:

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

希望这对其他人有所帮助。

【讨论】:

【参考方案16】:

如果您使用 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();

【讨论】:

【参考方案17】:

此查询获取数据库中所有列的列表,而无需指定表名。它返回一个仅包含列名的列表:

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

但是,当我在 phpmyadmin 中运行此查询时,它显示了一系列错误。尽管如此,它还是奏效了。所以请谨慎使用。

【讨论】:

【参考方案18】:

如果您只需要字段名称和类型(也许是为了方便复制粘贴到 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'

如果你想要所有数据类型

【讨论】:

【参考方案19】:

我不是专家,但这对我有用..

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


【讨论】:

【参考方案20】:

如果你想将它们用于插入语句生成一个字符串:

    SELECT CONCAT('(',GROUP_CONCAT(`COLUMN_NAME`),')') 
    FROM `INFORMATION_SCHEMA`.`COLUMNS` 
    WHERE `TABLE_SCHEMA`='database_name' 
    AND `TABLE_NAME`='table_name';

【讨论】:

【参考方案21】:

我已经在 SQL Server 中尝试过这个查询,这对我有用:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')

【讨论】:

【参考方案22】:

DESCRIBE 的调用可以很好地获取表的所有列,但如果您需要对其进行过滤,则需要改用SHOW COLUMNS FROM

获取表格所有信息的PHP函数示例:

// get table columns (or return false if table not found)
function get_table_columns($db, $table) 
    
    global $pdo;

    if($cols = $pdo->query("DESCRIBE `$db`.`$table`")) 
        if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) 
            return $cols;
        
    
    
    return false;

就我而言,我必须找到表的主键。所以,我用了:

SHOW COLUMNS FROM `table` WHERE `Key`='PRI';

这是我的 PHP 函数:

// get table Primary Key
function get_table_pk($db, $table) 

    global $pdo;
            
    $q = "SHOW COLUMNS FROM `$db`.`$table` WHERE `Key` = 'PRI'";
    if($cols = $pdo->query($q)) 
        if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) 
            return $cols[0];
        
    
    
    return false;

【讨论】:

以上是关于MySQL查询以获取列名?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询以获取列名

mysql查询表的列名,顺序不对?

如何在mysql中获取值不为null的列名

MySQL Python查询匹配行名与列名

怎样在mysql中获取列名

sql语句怎么查询指定表的列名