資料庫是資料表的容器,建立時的字元集、排序規則選擇將影響所有子物件。本文詳細說明 CREATE DATABASE 語法、字元集選擇原則、權限授予、MySQLi/PDO 三介面實作、以及生產環境最佳實務。
| 設定 | 推薦值 | 理由 |
| CHARACTER SET | utf8mb4 | 支援完整 Unicode (含 Emoji、生僻字),utf8 僅支援 BMP |
| COLLATE | utf8mb4_unicode_ci | 標準 Unicode 排序規則,正確處理多語言排序、大小寫轉換 |
| 替代 COLLATE | utf8mb4_general_ci | 舊版相容、速度略快,但排序不準確 (如 ß=ss、Œ=OE) |
生產環境強制標準:
CREATE DATABASE myapp
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
MySQLi 物件導向建庫
<?php
$host = 'localhost'; $user = 'username'; $pass = 'password';
$mysqli = new mysqli($host, $user, $pass); // 建庫不指定 dbname
if ($mysqli->connect_error) {
die("連線失敗: " . $mysqli->connect_error);
}
$sql = "CREATE DATABASE IF NOT EXISTS myDB
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci";
if ($mysqli->query($sql) === true) {
echo "資料庫建立成功";
} else {
echo "建立失敗: " . $mysqli->error;
}
$mysqli->close();
MySQLi 程序式建庫
$conn = mysqli_connect($host, $user, $pass);
if (!$conn) die("連線失敗: " . mysqli_connect_error());
$sql = "CREATE DATABASE IF NOT EXISTS myDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (mysqli_query($conn, $sql)) {
echo "資料庫建立成功";
} else {
echo "建立失敗: " . mysqli_error($conn);
}
mysqli_close($conn);
PDO 建庫 (推薦)
<?php
$host = 'localhost'; $user = 'username'; $pass = 'password';
try {
// 連線不指定 dbname
$pdo = new PDO("mysql:host=$host", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE IF NOT EXISTS myDBPDO
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci";
$pdo->exec($sql); // DDL 使用 exec()
echo "資料庫建立成功";
} catch (PDOException $e) {
echo "建立失敗: " . $e->getMessage();
}
$pdo = null;
權限授予:建立專用資料庫使用者
最佳實務:每個應用使用專用帳號,最小權限原則。
-- 1. 建立使用者 (僅本機連線)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password_here';
-- 2. 授予資料庫權限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER,
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW,
CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER
ON `myapp`.* TO 'myapp_user'@'localhost';
-- 3. 刷新權限
FLUSH PRIVILEGES;
-- 4. 如需遠端連線 (限制特定 IP)
CREATE USER 'myapp_user'@'192.168.1.%' IDENTIFIED BY 'strong_password_here';
GRANT ... ON `myapp`.* TO 'myapp_user'@'192.168.1.%';
PHP 連線使用專用帳號
$pdo = new PDO(
"mysql:host=localhost;dbname=myapp;charset=utf8mb4",
'myapp_user',
'strong_password_here',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
常見操作:檢查、列出、刪除、修改資料庫
| 操作 | SQL | PHP (PDO) |
| 檢查存在 | SHOW DATABASES LIKE 'myapp' | $pdo->query("SHOW DATABASES LIKE 'myapp'")->rowCount() > 0 |
| 列出所有 | SHOW DATABASES | $pdo->query("SHOW DATABASES")->fetchAll(PDO::FETCH_COLUMN) |
| 查看建庫語句 | SHOW CREATE DATABASE myapp | $pdo->query("SHOW CREATE DATABASE myapp")->fetchColumn() |
| 修改字元集 | ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci | $pdo->exec("ALTER DATABASE ...") |
| 刪除資料庫 | DROP DATABASE IF EXISTS myapp | $pdo->exec("DROP DATABASE IF EXISTS myapp") |
| 切換預設資料庫 | USE myapp | $pdo->exec("USE myapp") 或 DSN 指定 dbname |
資料庫層級配置最佳實務
- 統一字元集:建庫時指定 utf8mb4,避免表/欄位層級不一致導致隱式轉換效能損失
- 命名規範:小寫 + 底線
my_app_db,避免大小寫敏感問題 (Linux 區分大小寫)
- 專用帳號:根帳號僅限管理,應用使用最小權限帳號
- 備份策略:建立後立即納入自動備份排程
- 監控指標:容量、連線數、慢查詢、複寫延遲
- 版本控管:DDL 變更透過遷移腳本管理,不可手動直接操作生產庫
連線參數補充:非標準埠號、Socket、SSL
// 非標準埠號 (MySQLi)
$mysqli = new mysqli('localhost', 'user', 'pass', '', 3307); // 第 5 參數為 port
// 非標準埠號 (PDO)
$pdo = new PDO("mysql:host=localhost;port=3307;dbname=db", 'user', 'pass');
// Unix Socket (本機高效能)
$pdo = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=db", 'user', 'pass');
// SSL 連線 (生產環境強制)
$pdo = new PDO(
"mysql:host=db.example.com;port=3306;dbname=db",
'user', 'pass',
[
PDO::MYSQL_ATTR_SSL_CA => '/path/ca.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/path/client-cert.pem',
PDO::MYSQL_ATTR_SSL_KEY => '/path/client-key.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
]
);
總結
建立資料庫看似簡單,但字元集選擇 (utf8mb4)、排序規則 (unicode_ci)、專用帳號最小權限、SSL 加密連線等決策將長期影響應用的資料正確性、安全性與效能。PDO 提供統一、例外導向、支援多資料庫的介面,是現代 PHP 專案的標準選擇。將建庫腳本納入基礎設施即代碼管理,確保環境一致性與可重現性。
- 上一篇文章: PHP MySQL 建立資料表完整指南:CREATE TABLE 語法、欄位屬性、索引與三大介面實作
- 下一篇文章: PHP 連接 MySQL 完整指南:MySQLi vs PDO 深度比較、連線參數、錯誤處理與最佳實務
Copyright ©
程式碼之家 All Rights Reserved