| 對象 | 最大長度 | 字符集 | 風格 | 示例 |
|---|---|---|---|---|
| 資料庫 | 64 | [a-z_] | 小寫+下劃線 | biz_order |
| 表 | 64 | [a-z_] | 小寫+下劃線,模塊前綴 | order_info、order_item |
| 列 | 64 | [a-z_] | 小寫+下劃線,語義清晰 | create_time、user_id |
| 索引 | 64 | [a-z_] | idx_表_列 / uk_表_列 | idx_order_user_id、uk_user_mobile |
| 別名 | 255 | [a-z_] | 小寫+下劃線 | o、oi |
命名空間建議:
資料庫::表::列,如biz_order::order_info::user_id。
| 業務含義 | 標準列名 | 類型 | 備註 |
|---|---|---|---|
| 主鍵 ID | id | BIGINT UNSIGNED | 自增、無業務含義 |
| 名稱/標題 | name | VARCHAR(128) | |
| 創建時間 | create_time | DATETIME | 默認 CURRENT_TIMESTAMP |
| 更新時間 | update_time | DATETIME | 默認 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
| 過期時間 | expire_time | DATETIME | 可空 |
| 狀態 | status | TINYINT | 0 正常、1 隱藏、2 刪除(邏輯刪除) |
| IP 地址 | ip | CHAR(15) / VARBINARY(16) | IPv4 用 CHAR(15),IPv6 用 VARBINARY(16) |
| 資源/圖片 ID | resource_id | BIGINT UNSIGNED | 關聯資源表 |
| 標簽 | tag | VARCHAR(64) | |
| 類型 | type | TINYINT | 枚舉值在字典表維護 |
idx_表名_列名[_列名2]uk_表名_列名[_列名2]PRIMARY,不另行命名。log_,如 log_user_login、log_api_access。award_、award_exchange。原表名_YYYYMMDD,如 order_info_20240115。優先使用 username(或業務唯一鍵)關聯,而非 user_id。
原因:大多數查詢已攜帶 username,避免額外 JOIN user 表反查,減少 IO 與延遲。
例外:高頻更新、username 長度大、需屏蔽業務含義時用 user_id。
order_detail、article_content),主表保持窄行,提升緩存命中與掃描速度。TINYINT(1B) SMALLINT(2B) MEDIUMINT(3B) INT(4B) BIGINT(8B),能用小的不用大的。CHAR(M) 適合長度固定(MD5、UUID、手機號),變長 VARCHAR(M) 適合不定長。5.0.3+ VARCHAR(M) 按字節數限制,utf8mb4 下 M=191 佔 764 字節。TEXT 族(TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT)按需選擇,不能設默認值、索引需指定前綴長度。ENUM、SET:擴展需 DDL,改用 TINYINT + 字典表。AUTO_INCREMENT、TEXT/BLOB、TIMESTAMP 外,**所有列必須顯式指定 DEFAULT**,並盡量 NOT NULL。NULL 額外佔 1 bit、索引統計複雜、COUNT(col) 不計 NULL。| 特性 | CHAR(M) | VARCHAR(M) |
|---|---|---|
| 存儲長度 | 固定 M 字符,不足右補空格 | 實際長度 + 1~2 字節長度前綴 |
| 尾部空格 | 讀取時自動去除 | 保留 |
| 最大 M (utf8mb4) | 255 字符 (1020 字節) | 16383 字符 (65532 字節) |
| 索引 | 全長索引 | 可指定前綴長度 |
INT(4)、INT(10) **不限制取值範圍**,範圍永遠是 -2^31 ~ 2^31-1(有符號)或 0 ~ 2^32-1(無符號)。M 僅配合 ZEROFILL 填充前導零(如 INT(5) ZEROFILL 存 4 顯示 00004),生產禁用 ZEROFILL(隱式加 UNSIGNED、臨時表易出 Bug)。
idx(a,b,c) 支援 a、a,b、a,b,c,不支援 b、c、b,c。INDEX ((col+1)) 無效,5.7+ 可用虛擬列繞過)。!=、<>、IS NULL、LIKE '%abc'、函數運算列、JOIN 條件類型不一致 → **全不走索引**。=/<=>/IN,不支援範圍/排序。CREATE TABLE `admin` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`role_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '角色ID',
`username` CHAR(16) NOT NULL COMMENT '用戶名',
`password` CHAR(33) NOT NULL COMMENT '密碼哈希',
`acl` TEXT NOT NULL COMMENT '權限位圖JSON',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理員表';
pt-online-schema-change 或 gh-ost**,禁止直接 ALTER TABLE。EXPLAIN 核心 SQL,變更後對比執行計劃。本規範覆蓋 命名、類型、索引、建模、DDL 流程 全鏈路,核心思想:**小而精的類型、語義清晰的命名、業務驅動的索引、可演進的 Schema**。團隊應將其內化為 Code Review 標準、CI 檢查腳本(如 sql-lint)、新人入職必讀文檔,讓規範成為肌肉記憶而非架空文檔。