首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 獲取 ENUM 欄位所有可能值:SHOW COLUMNS + 字串解析實戰 (PHP 範例)

     編輯:MySQL 資料庫相關知識

需求:動態獲取表中 ENUM 或 SET 欄位的定義值清單(如 ENUM('Y','N') → ['Y','N']),用於前端下拉選單、驗證規則同步。MySQL 無直接函數返回枚舉值陣列,但可透過 SHOW COLUMNS 取得 Type 字串再解析。

核心 SQL

SHOW COLUMNS FROM `table_name` LIKE 'enum_column_name';
-- 返回欄位資訊,其中 Type 欄位如:enum('Y','N','M')

PHP 完整解析範例

<?php
$host = 'localhost';
$db   = 'mysql';          // 示範用系統庫
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);

$stmt = $pdo->prepare("SHOW COLUMNS FROM `user` LIKE 'Select_priv'");
$stmt->execute();
$col = $stmt->fetch();

if ($col && stripos($col['Type'], 'enum') === 0) {
    // Type 範例: enum('N','Y')
    $type = $col['Type'];
    // 擷取括號內內容
    preg_match("/\((.*)\)/", $type, $matches);
    $valuesStr = $matches[1] ?? '';  // 'N','Y'
    // 分割並去除單引號
    $enumValues = array_map(function($v) {
        return trim($v, "'");
    }, explode(',', $valuesStr));
    
    print_r($enumValues);
    // Array ( [0] => N [1] => Y )
}
?>

關鍵步驟解析

  1. SHOW COLUMNS ... LIKE 精準定位目標欄位,避免全表掃描。
  2. 取得 Type 字串,格式固定為 enum('v1','v2',...) 或 set('v1','v2',...)。
  3. 正則 /\((.*)\)/ 擷取括號內逗號分隔字串。
  4. explode(',', ...) 分割,trim(\"'\"') 去除單引號。
  5. 結果為純值陣列,直接可用於 `