數據庫對象管理是 MySQL 運維的基石。本文匯總創建、編碼設置、切換上下文、查看元數據、刪除清理的核心命令,重點解析**字符集層級傳遞機制**、**編碼遷移陷阱**、**權限隔離最佳實踐**,構建 DBA 庫級操作的標準化速查手冊。
-- 最簡形式(繼承服務端默認字符集,通常 latin1,強烈不推薦)
CREATE DATABASE my_db;
-- 幂等創建
CREATE DATABASE IF NOT EXISTS my_db;
-- 生產級:顯式指定字符集與排序規則(黃金標準)
CREATE DATABASE IF NOT EXISTS my_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
Server 默認字符集 (character_set_server)
↓ 未顯式指定時
Database 默認字符集 (CREATE DATABASE ... DEFAULT CHARSET)
↓ 未顯式指定時
Table 默認字符集 (CREATE TABLE ... DEFAULT CHARSET)
↓ 未顯式指定時
Column 字符集 (Column 定義 CHARSET)
utf8mb4,後續建表無需重複聲明,**自動繼承**,杜絕「表級 latin1、列級 utf8」的編碼地獄。COLLATE utf8mb4_general_ci:不區分大小寫、按字符集排序;utf8mb4_bin 區分大小寫、二進制比較(索引/唯一約束精確匹配常用)。
-- 列出所有數據庫
SHOW DATABASES;
-- 或
SHOW SCHEMAS;
-- 切換當前會話默認數據庫(後續無前綴表操作針對此庫)
USE my_db;
-- 查看當前庫
SELECT DATABASE();
-- 1. 服務端字符集系統變量(全景圖)
SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 | -- 客戶端發送編碼
| character_set_connection | utf8mb4 | -- 連接層轉碼目標
| character_set_database | utf8mb4 | -- 當前庫默認編碼
| character_set_filesystem | binary | -- 文件系統編碼
| character_set_results | utf8mb4 | -- 結果集返回編碼
| character_set_server | utf8mb4 | -- 服務端默認編碼
| character_set_system | utf8 | -- 系統標識符編碼(固定)
| character_sets_dir | /usr/share/mysql/charsets/ | -- 字符集文件目錄
+--------------------------+----------------------------+
-- 2. 當前庫創建信息(含默認字符集)
SHOW CREATE DATABASE my_db;
-- 結果:CREATE DATABASE `my_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
-- 3. 所有支援字符集
SHOW CHARACTER SET;
-- 僅修改庫默認字符集(僅影響後續新建表,現有表/列**不變**)
ALTER DATABASE my_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 真正遷移現有表數據:需逐表執行
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER DATABASE **不轉換現有數據**,僅改元數據默認值。真正遷移必須逐表 CONVERT TO(鎖表重建)或用 gh-ost 線上遷移。
-- 直接刪除(不存在報錯)
DROP DATABASE my_db;
-- 幂等刪除(部署/清理腳本推薦)
DROP DATABASE IF EXISTS my_db;
DROP DATABASE,需走變更流程:備份驗證 → 應用下線確認 → 從庫先刪 → 主庫刪 → 監控確認。
-- 應用讀寫賬戶(僅特定庫)
CREATE USER 'app_rw'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2024';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `app_db`.* TO 'app_rw'@'192.168.1.%';
-- 應用只讀賬戶
CREATE USER 'app_ro'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2024';
GRANT SELECT ON `app_db`.* TO 'app_ro'@'192.168.1.%';
-- 開發/測試賬戶(僅開發庫)
GRANT ALL PRIVILEGES ON `dev_db`.* TO 'dev_user'@'192.168.1.%';
-- DBA 管理賬戶(受限主機)
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
*.* 濫用。%。mysql.db/mysql.tables_priv 清理殭屍權限。| 操作 | 命令 | 關鍵參數 |
|---|---|---|
| 創建庫 | CREATE DATABASE IF NOT EXISTS db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; | 顯式編碼、幂等 |
| 查看庫編碼 | SHOW CREATE DATABASE db; | 元數據權威來源 |
| 查看會話編碼 | SHOW VARIABLES LIKE 'character_set_%'; | 排查亂碼首選 |
| 切換庫 | USE db; | 會話上下文 |
| 修改庫默認編碼 | ALTER DATABASE db CHARSET utf8mb4; | 僅影響新表 |
| 遷移表編碼 | ALTER TABLE t CONVERT TO CHARSET utf8mb4; | 鎖表/線上工具 |
| 刪除庫 | DROP DATABASE IF EXISTS db; | 幂等、級聯清理 |
數據庫操作雖「輕」,編碼傳遞、權限隔離、遷移陷阱卻「重」。掌握「庫級顯式 utf8mb4 → 表級自動繼承 → 列級無需聲明」的編碼鏈路,熟練 CONVERT TO 與 ALTER DATABASE 的語義邊界,落實「庫粒度授權、IP 白名單、幂等腳本」的運維鐵律,即可在百庫千表的雲端叢林中,構建**編碼純淨、權限極簡、變更可控**的數據治理體系。