釐清 INSERT 語法結構,特別是 VALUES 子句中值的引號處理規則,避免語法錯誤與資料型別不符。
INSERT INTO 資料表 (欄位1, 欄位2, ...) VALUES ("值1", "值2", ...)
$exec = "INSERT INTO info (ename, pcname) VALUES ('" . $_POST["ename"] . "', '" . $_POST["pcname"] . "')";
| 欄位型別 | VALUES 中寫法 | 說明 |
|---|---|---|
| VARCHAR, CHAR, TEXT | '字串值' | **必須用單引號包裹** |
| INT, BIGINT | 123 | **不可加引號**,否則隱含型別轉換 |
| FLOAT, DOUBLE, DECIMAL | 12.34 | **不可加引號** |
| DATE, DATETIME, TIMESTAMP | '2024-01-15' | **需單引號**,格式符合 MySQL 標準 |
| NULL | NULL | 不加引號,關鍵字大小寫不敏感 |
-- 錯誤:數值欄位加了引號
INSERT INTO products (price) VALUES ('99.90'); -- 隱含轉換,效能差且易出錯
-- 正確:
INSERT INTO products (price) VALUES (99.90);
-- 錯誤:字串未加引號
INSERT INTO users (name) VALUES (John); -- 語法錯誤
-- 正確:
INSERT INTO users (name) VALUES ('John');
不要手動拼接字串,改用預處理語句:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "pwd");
$stmt = $pdo->prepare("INSERT INTO info (ename, pcname) VALUES (?, ?)");
$stmt->execute([$_POST['ename'], $_POST['pcname']]);
// PDO 自動處理型別、引號、跳脫,安全且正確
?>
INSERT INTO info (ename, pcname) VALUES
('Alice', 'PC001'),
('Bob', 'PC002'),
('Charlie', 'PC003');
批次插入比迴圈單筆插入快數十倍,大量資料匯入必用。
INSERT INTO stats (date, views) VALUES ('2024-01-15', 1)
ON DUPLICATE KEY UPDATE views = views + 1;
主鍵/唯一鍵衝突時執行更新,適合計數器、統計表。
掌握 INSERT 語法細節,配合 PDO 預處理,能寫出正確、安全、高效的資料寫入程式。