從 PHP 交互、數據類型選型、查詢優化到空值語義,6 個實戰技巧助你寫出更健壯、高效的 MySQL 應用代碼。
MySQL 原生客戶端以 ; 結束語句,但 PHP 腳本中 mysql_query() / PDO::exec() 已封裝發送,**SQL 字符串末尾不需分號**,加反而可能導致 PHP 解析器誤判。
// 推薦
mysql_query("INSERT INTO t (a,b) VALUES ('$a','$b')");
// 不推薦
mysql_query("INSERT INTO t (a,b) VALUES ('$a','$b');");
$result = mysql_query("SELECT cust_id, surname, firstname FROM customer");
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { // 關聯數組
echo "ID: {$row['cust_id']}\n";
echo "姓: {$row['surname']}\n";
echo "名: {$row['firstname']}\n\n";
}
MYSQL_ASSOC / PDO::FETCH_ASSOC:鍵為列名,$row['cust_id'] 遠優於 $row[0]。SELECT w.name AS wname, r.name AS rname ... → $row['wname']。$row['COUNT(*)']。LONG VARCHAR / MEDIUMTEXT 等具體類型,建表時顯式指定長度層級。YYYY-MM-DD,PHP date('Y-m-d') 生成。日期間可直接相減得天數:$age = $current_date - $birthdate;(MySQL 隱式轉換)。mysql_unbuffered_query() —— 大結果集流式處理$res = mysql_unbuffered_query("SELECT * FROM huge_table");
// 立即返回,不等待全部結果集緩存到 PHP 內存
// 不能用 mysql_num_rows(),因總行數未知
while ($row = mysql_fetch_assoc($res)) {
// 逐行處理,內存常數級
}
適用:百萬級導出、ETL、報表生成。慎用於事務中(未讀完結果集前連接被佔用)。
* 與 % 分工明確| 通配符 | 匹配對象 | 配合關鍵字 | 示例 |
|---|---|---|---|
* | 列名(投影) | 無 | SELECT * FROM t |
% | 列值(過濾) | LIKE | WHERE name LIKE 'Zhang%' |
_ | 單個字符(值) | LIKE | WHERE code LIKE '_A__' |
% 必須與 LIKE 搭配,單獨使用無效。
NULL。WHERE col LIKE '%' 匹配 '',不匹配 NULL。WHERE col IS NULL 才匹配 NULL。IS NULL OR = ''。細節決定質量。這 6 個技巧看似微小,貫穿開發全鏈路,養成習慣,少踩無數坑。