MySQL查询获取列名?

我想让所有的mysql表的col名称在php数组?

对此有疑问吗?

672625 次浏览

你可以使用以下查询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具有。

今天我学到了更好的方法。请看ircmaxell的回答。


解析SHOW COLUMNS FROM table;的输出

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

似乎有两种方法:

DESCRIBE `tablename`

SHOW COLUMNS FROM `tablename`

关于DESCRIBE的更多信息:http://dev.mysql.com/doc/refman/5.0/en/describe.html

最好的方法是使用INFORMATION_SCHEMA元数据虚拟数据库。特别是INFORMATION_SCHEMA。列表…

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

它非常强大,可以给你大量的信息,而不需要解析文本(比如列类型,列是否为空,最大列大小,字符集,等等)…

哦,它是标准SQL(而SHOW ...是MySQL特定的扩展名)…

有关SHOW...和使用INFORMATION_SCHEMA表的区别的更多信息,请查看MySQL 一般的INFORMATION_SCHEMA文档

我以前做过这种事。

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

使用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;
}
< p > "警告 此扩展在PHP 5.5.0中已弃用,并将在未来被移除。" < / p >

旧的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; }
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();

在mysql 5.1(不是5.5)中显示列使用了一个临时磁盘表。

所以在某些情况下,它可以被认为是很慢的。至少,它可以提升你的created_tmp_disk_tables值。假设每个连接或每个页面请求都有一个临时磁盘表。

显示列并不是真的那么慢,可能是因为它使用了文件系统缓存。Phpmyadmin始终表示~0.5ms。这与服务一个wordpress页面的500 -1000毫秒相比根本不算什么。但有时还是很重要的。其中涉及到磁盘系统,你永远不知道当服务器忙、缓存满、硬盘卡住等情况下会发生什么。

通过Select * from…限制1检索列名大约0.1ms,并且它也可以使用查询缓存。

下面是我优化过的从表中获取列名的代码,如果可能的话不使用显示列:

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

在WORDPRESS:

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

试试我个人使用的这个方法:

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

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

不确定这是否是你想要的,但这对我来说很管用:

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

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

检查结果:print_r($col_names);

这个问题很老了,但我在这里寻找一种方法,以动态的方式查找给定查询的字段名(不一定只是表的字段)。由于人们在其他相关问题中一直把这个作为给定任务的答案,我在这里分享我发现的方法,使用加文·辛普森的技巧:

//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模块,如果需要(删除数据转储部分)。

希望这能帮助到其他人。

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

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


}

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

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

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

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

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;

enter image description here

如果你想检查哪个字段允许空类型等,那么你可以使用这个

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;

enter image description here

你想检查更多,然后认为链接也帮助你。

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

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

DESC `table name`

DESCRIBE `table name`

SHOW COLUMNS FROM `table name`

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

如果需要所有数据类型

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

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

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

这将生成一个带逗号分隔符的列名字符串:

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