首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 入門

PHP MySQL 建立資料庫完整指南:CREATE DATABASE、字元集配置、權限與三大介面實作

     編輯:PHP 入門

PHP MySQL 建立資料庫深度解析:DDL 語法、字元集排序規則、權限模型與實戰代碼

資料庫是資料表的容器,建立時的字元集、排序規則選擇將影響所有子物件。本文詳細說明 CREATE DATABASE 語法、字元集選擇原則、權限授予、MySQLi/PDO 三介面實作、以及生產環境最佳實務。

CREATE DATABASE 語法

CREATE DATABASE [IF NOT EXISTS] db_name
    [CHARACTER SET charset_name]
    [COLLATE collation_name];

字元集與排序規則選擇 (關鍵決策)

生產環境強制標準:

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,
    ]
);

常見操作:檢查、列出、刪除、修改資料庫

設定推薦值理由
CHARACTER SETutf8mb4支援完整 Unicode (含 Emoji、生僻字),utf8 僅支援 BMP
COLLATEutf8mb4_unicode_ci標準 Unicode 排序規則,正確處理多語言排序、大小寫轉換
替代 COLLATEutf8mb4_general_ci舊版相容、速度略快,但排序不準確 (如 ß=ss、Œ=OE)

資料庫層級配置最佳實務

  1. 統一字元集:建庫時指定 utf8mb4,避免表/欄位層級不一致導致隱式轉換效能損失
  2. 命名規範:小寫 + 底線 my_app_db,避免大小寫敏感問題 (Linux 區分大小寫)
  3. 專用帳號:根帳號僅限管理,應用使用最小權限帳號
  4. 備份策略:建立後立即納入自動備份排程
  5. 監控指標:容量、連線數、慢查詢、複寫延遲
  6. 版本控管: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 專案的標準選擇。將建庫腳本納入基礎設施即代碼管理,確保環境一致性與可重現性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作SQLPHP (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