需求:動態獲取表中 ENUM 或 SET 欄位的定義值清單(如 ENUM('Y','N') → ['Y','N']),用於前端下拉選單、驗證規則同步。MySQL 無直接函數返回枚舉值陣列,但可透過 SHOW COLUMNS 取得 Type 字串再解析。
SHOW COLUMNS FROM `table_name` LIKE 'enum_column_name';
-- 返回欄位資訊,其中 Type 欄位如:enum('Y','N','M')
<?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 )
}
?>
SHOW COLUMNS ... LIKE 精準定位目標欄位,避免全表掃描。Type 字串,格式固定為 enum('v1','v2',...) 或 set('v1','v2',...)。/\((.*)\)/ 擷取括號內逗號分隔字串。explode(',', ...) 分割,trim(\"'\"') 去除單引號。SELECT COLUMN_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'tbl_name'
AND COLUMN_NAME = 'col_name';
適用於:需在儲存過程、觸發器、多資料庫統一查詢中獲取型別定義。
if (!in_array($input, $enumValues)) throw InvalidArgumentException;ALTER TABLE ... MODIFY ENUM(...) **新增值只能加在尾部**,否則舊資料索引對應錯誤。