如何获取mysql表的列数据类型?


103

我想获取mysql表的列数据类型。

以为我可以使用MYSQLFIELD结构,但它是枚举的字段类型。

然后我尝试了 mysql_real_query()

我得到的错误是 query was empty

如何获取列数据类型?

Answers:


116

您可以使用information_schema列表:

SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE table_name = 'tbl_name' AND COLUMN_NAME = 'col_name';

9
别忘了:AND INDEX_SCHEMA ='database_name'– 2009
英萨尔

我亲自尝试过此操作,并同意此答案确实可以达到OP的预期目的。附带说明一下,即使在手册中,“ table_name”是小写字母也有点怪异,应该不大写吗?(并不是说
有所作为

8
另请注意,数据类型是否具有设置的长度,例如。VARCHAR(50)可以SELECT COLUMN_TYPE用来获取该额外信息。
chutsu 2012年

11
如果INDEX_SCHEMA不工作,那么尝试TABLE_SCHEMA =“数据库名称”
senK

2
如果您想知道所有列的类型(删除AND COLUMN_NAME = 'col_name'),则除非显示列名:,否则此查询无用SELECT COLUMN_NAME, DATA_TYPE FROM etc.
Skippy le Grand Gourou 2015年

78

下面的查询返回有关每个字段的信息列表,包括MySQL字段类型。这是一个例子:

SHOW FIELDS FROM tablename
/* returns "Field", "Type", "Null", "Key", "Default", "Extras" */

请参阅本手册页


20
另一种选择是EXPLAIN表名。
hobodave

这个答案需要进一步的处理才能得到类型... user83591提供的答案要好得多
chutsu 2012年

添加WHERE FIELD = '<your column name>'如果你想要一个列信息。
普莱西德

37

大多数答案都是重复的,将它们分组可能会很有用。基本上已经提出了两个简单的选择。

第一选择

第一个选项有4个不同的别名,其中一些别名很短:

EXPLAIN db_name.table_name;
DESCRIBE db_name.table_name;
SHOW FIELDS FROM db_name.table_name;
SHOW COLUMNS FROM db_name.table_name;

(注意:作为替代db_name.table_name,可以使用第二个FROM :)db_name FROM table_name

这给出了类似的内容:

+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| product_id       | int(11)      | NO   | PRI | NULL    |       |
| name             | varchar(255) | NO   | MUL | NULL    |       |
| description      | text         | NO   |     | NULL    |       |
| meta_title       | varchar(255) | NO   |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

第二选择

第二个选择要长一些:

SELECT
  COLUMN_NAME, DATA_TYPE 
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_SCHEMA = 'db_name'
AND
  TABLE_NAME = 'table_name';

它也不太健谈:

+------------------+-----------+
| column_name      | DATA_TYPE |
+------------------+-----------+
| product_id       | int       |
| name             | varchar   |
| description      | text      |
| meta_title       | varchar   |
+------------------+-----------+

它的优点是允许使用AND COLUMN_NAME = 'column_name'(或like)按列选择。


20

要获取所有列的数据类型:

describe table_name

或仅是一列:

describe table_name column_name

不知道你能做到这一点。您刚刚为我省去了一堆遍历信息模式的麻烦。
Betty Mock

11

请使用下面的mysql查询。

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
FROM information_schema.columns 
WHERE table_schema = '<DATABASE NAME>' 
AND table_name = '<TABLE NAME>' 
AND COLUMN_NAME = '<COLOMN NAME>' 

MySQL查询结果


但这只会给出最大长度。SELECT DATA_TYPE像其他答案所建议的那样使用更好吗?
Fabio说恢复莫妮卡的时间为

是的,你是对的。我只是忘记添加它。我现在纠正了它。谢谢
Prasant Kumar

5

引用此链接

mysql> SHOW COLUMNS FROM mytable FROM mydb;
mysql> SHOW COLUMNS FROM mydb.mytable;

希望这对您有帮助



2

查询以找出任何数据库中正在使用的列的所有数据类型

SELECT distinct DATA_TYPE FROM INFORMATION_SCHEMA.columns 
WHERE table_schema = '<db_name>' AND column_name like '%';

3
不是AND column_name like '%'多余的吗?
Skippy le Grand Gourou 2015年

1

从mytable显示列

自包含的完整示例通常很有用。

<?php
  // The server where your database is hosted                 localhost
  // The name of your database                                mydatabase
  // The user name of the database user                       databaseuser
  // The password of the database user                        thesecretpassword
  // Most web pages are in utf-8 so should be the database    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
  try
  {
    $pdo = new PDO("mysql:host=localhost;dbname=mydatabase", "databaseuser", "thesecretpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));  
  }
    catch(PDOException $e)
  {
    die('Could not connect: ' . $e->getMessage());
  }

  $sql   = "SHOW COLUMNS FROM mytable";
  $query = $pdo->prepare($sql);
  $query->execute();

  $err = $query->errorInfo();
  $bug = $err[2];

  if ($bug != "") { echo "<p>$bug</p>"; }

  while ($row = $query->fetch(PDO::FETCH_ASSOC))
  {
    echo "<pre>" . print_r($row, true) . "</pre>";
  }

  /* OUTPUT SAMPLE  
  Array
  (
      [Field] => page_id
      [Type] => char(40)
      [Null] => NO
      [Key] => 
      [Default] => 
      [Extra] => 
  )

  Array
  (  
      [Field] => last_name
      [Type] => char(50)
      More ...
  */
?>

1
该任择议定书没有标记与这个问题php标签
罗蒂米

1
ResultSet rs = Sstatement.executeQuery("SELECT * FROM Table Name");

ResultSetMetaData rsMetaData = rs.getMetaData();

int numberOfColumns = rsMetaData.getColumnCount();
System.out.println("resultSet MetaData column Count=" + numberOfColumns);

for (int i = 1; i <= numberOfColumns; i++) {
 System.out.println("column number " + i);

  System.out.println(rsMetaData.getColumnTypeName(i));
}

OP未使用标签标记该问题java
罗蒂米

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.