方法一:查詢 information_schema.COLUMNS(標準、跨資料庫)
-- 指定資料庫與表
SELECT COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tbl_name'
ORDER BY ORDINAL_POSITION;
- 可加
DATA_TYPE、COLUMN_TYPE、IS_NULLABLE、COLUMN_KEY、COLUMN_DEFAULT、EXTRA 等欄位獲取完整定義。
- 跨資料庫、跨實例(連線許可)通用。
方法二:SHOW COLUMNS / DESC(簡潔、Session 級)
SHOW COLUMNS FROM tbl_name;
SHOW COLUMNS FROM db_name.tbl_name;
DESC tbl_name; -- 別名
- 輸出:Field、Type、Null、Key、Default、Extra。
- 僅限當前連線資料庫或指定庫.表。
方法三:應用層驅動 API(程式碼中獲取)
JDBC (Java)
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getColumns(null, "db_name", "tbl_name", "%");
while (rs.next()) {
String colName = rs.getString("COLUMN_NAME");
String colType = rs.getString("TYPE_NAME");
int nullable = rs.getInt("NULLABLE");
}
Python (PyMySQL / mysql-connector)
cursor.execute("SELECT * FROM tbl_name LIMIT 0")
columns = [desc[0] for desc in cursor.description]
# 或
cursor.execute("SHOW COLUMNS FROM tbl_name")
columns = [row[0] for row in cursor.fetchall()]
PHP (mysqli / PDO)
// mysqli
$result = $mysqli->query("SELECT * FROM tbl_name LIMIT 0");
$fields = $result->fetch_fields();
foreach ($fields as $field) { echo $field->name; }
// PDO
$stmt = $pdo->query("SELECT * FROM tbl_name LIMIT 0");
for ($i=0; $i<$stmt->columnCount(); $i++) {
$meta = $stmt->getColumnMeta($i);
echo $meta['name'];
}
對比選擇建議
| 場景 | 推薦方法 |
| SQL 腳本/工具/跨庫 | information_schema.COLUMNS |
| 命令行快速查看 | SHOW COLUMNS / DESC |
| 應用程式動態獲取 | 驅動層 Metadata API |
| 需完整定義(類型、預設、註釋) | information_schema.COLUMNS |
常見坑
information_schema 查詢大量表時較慢,可加 TABLE_SCHEMA 過濾。
- 權限:需
SELECT 權限於 information_schema 或該表。
- 驅動層
LIMIT 0 技巧不觸發全表掃描,僅獲取元數據。