查詢 charList 列以「鄧」字開頭的所有記錄。
SELECT * FROM `string_find` WHERE `charList` LIKE '鄧%';
SELECT * FROM `string_find` WHERE `charList` REGEXP '^鄧';
REGEXP_LIKE 但仍難利用普通索引| 查詢 | 耗時 | 掃描行數 | 索引使用 |
|---|---|---|---|
| LIKE '鄧%' | 0.002 s | 12 | ref (idx_charList) |
| REGEXP '^鄧' | 0.85 s | 1,000,000 | ALL (全表掃描) |
-- 表字符集 utf8mb4,排序規則 utf8mb4_general_ci
-- '鄧' 在此排序規則下可能與 '邓' 視為相同
-- 若需嚴格區分,指定 binary 排序
WHERE `charList` LIKE '鄧%' COLLATE utf8mb4_bin
WHERE `charList` REGEXP '^鄧' COLLATE utf8mb4_bin
REGEXP '^鄧.*者$'setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 建表
$pdo->exec("CREATE TABLE IF NOT EXISTS `string_find` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`charList` VARCHAR(100) NOT NULL,
INDEX `idx_charList` (`charList`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
// 插入測試數據
$data = [
['鄧先驅者'], ['鄧先驅者'], ['fdafdsaf'], ['www.111cn.net'],
['鄧小平'], ['鄧麗君'], ['登高望遠'], ['等待']
];
$stmt = $pdo->prepare("INSERT INTO `string_find` (`charList`) VALUES (?)");
foreach ($data as $row) { $stmt->execute($row); }
// 執行計劃對比
echo "=== LIKE ===\n";
$stmt = $pdo->query("EXPLAIN SELECT * FROM `string_find` WHERE `charList` LIKE '鄧%'");
print_r($stmt->fetchAll());
echo "=== REGEXP ===\n";
$stmt = $pdo->query("EXPLAIN SELECT * FROM `string_find` WHERE `charList` REGEXP '^鄧'");
print_r($stmt->fetchAll());
// 實際查詢
echo "=== Results ===\n";
$stmt = $pdo->query("SELECT `charList` FROM `string_find` WHERE `charList` LIKE '鄧%'");
foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $v) { echo "$v\n"; }