CREATE DATABASE 是資料庫專案的起點。一個良好的資料庫創建:字符集統一、排序規則正確、權限最小化、命名規範,能避免後續「亂碼、排序錯誤、大小寫敏感、權限過大」等棘手問題。本文系統講解命令列工具、SQL 語法、PHP 實戰,並給出生產級建庫清單。
[root@host]# mysqladmin -u root -p create RUNOOB Enter password:******
latin1_swedish_ci 或 utf8mb4_general_ci,視版本與配置)。生產環境建議用 SQL 顯式指定。CREATE DATABASE [IF NOT EXISTS] db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name];
CREATE DATABASE IF NOT EXISTS `myapp_prod`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci; -- MySQL 8.0+ 推薦,支援 Unicode 9.0、不區分重音/大小寫
utf8mb4:支援完整 Unicode(含 Emoji、生僻字),必選。utf8mb4_0900_ai_ci(8.0+):基於 Unicode 9.0,Accent Insensitive(不區分重音)、Case Insensitive(不區分大小寫),排序更符合直覺。utf8mb4_general_ci(5.7/舊版):較舊、排序規則簡化、效能略高但準確度稍低。utf8(僅 3 Bytes,不支援 Emoji)和 latin1(西歐字符集)。<?php
$conn = new mysqli('localhost:3306', 'root', 'rootpassword');
if ($conn->connect_error) die('Connect failed: ' . $conn->connect_error);
$db = 'myapp_prod';
$sql = "CREATE DATABASE IF NOT EXISTS `$db`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci";
if ($conn->query($sql)) {
echo "Database `$db` created successfully\n";
} else {
echo "Create failed: " . $conn->error;
}
$conn->close();
?>
<?php
$dsn_no_db = 'mysql:host=localhost;port=3306;charset=utf8mb4';
$pdo = new PDO($dsn_no_db, 'root', 'rootpassword', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$db = 'myapp_prod';
$sql = "CREATE DATABASE IF NOT EXISTS `$db`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci";
$pdo->exec($sql);
echo "Database `$db` created successfully\n";
?>
-- 建立帳號 CREATE USER 'myapp_rw'@'%' IDENTIFIED BY 'strong_random_password'; CREATE USER 'myapp_ro'@'%' IDENTIFIED BY 'strong_random_password'; -- 授權:讀寫帳號 GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `myapp_prod`.* TO 'myapp_rw'@'%'; -- 授權:唯讀帳號(報表、BI、只讀副本) GRANT SELECT ON `myapp_prod`.* TO 'myapp_ro'@'%'; FLUSH PRIVILEGES;
myapp_prod_rw、myapp_staging_rw 等。{project}_{env},如 myapp_prod、myapp_staging、myapp_test。小寫、下劃線、無保留字。utf8mb4 + utf8mb4_0900_ai_ci(8.0+)或 utf8mb4_general_ci(5.7)。[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci init_connect = 'SET NAMES utf8mb4'
Error 1007: Database 'xxx' already exists:加 IF NOT EXISTS。Error 1044: Access denied:帳號無 CREATE DATABASE 權限,需 root 或具備全域 CREATE 權限帳號。ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci':MySQL 版本 < 8.0,改用 utf8mb4_general_ci 或 utf8mb4_unicode_ci。CREATE DATABASE 看似一行命令,實則決定了專案字符集命運、權限邊界、運維基線。將「utf8mb4 強制、專用帳號最小權限、命名規範、版本控管、備份同步」貫徹落地,為業務資料奠定乾淨、標準、可演進的基因組。