首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據類型與列類型完整手冊:選型原理、存儲開銷與實戰示例

     編輯:MySQL 資料庫相關知識

數據類型 vs 列類型

  • 數據類型:值的抽象分類(數值、字符串、日期、NULL)
  • 列類型:CREATE TABLE 時具體聲明的存儲格式(如 INT UNSIGNED、VARCHAR(100)、DATETIME),含長度、屬性、約束

數值列類型詳細表

類型有符號範圍無符號範圍存儲適用場景
TINYINT-128 ~ 1270 ~ 2551B狀態碼、布爾、年齡
SMALLINT-32,768 ~ 32,7670 ~ 65,5352B郵編、小計數器
MEDIUMINT-8,388,608 ~ 8,388,6070 ~ 16,777,2153B中等計數、顏色 RGB
INT / INTEGER-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,2954B通用 ID、外鍵、計數
BIGINT-9.22E18 ~ 9.22E180 ~ 1.84E198B巨大 ID、時間戳毫秒
FLOAT(M,D)±1.175E-38 ~ ±3.402E+38—4B單精度科學計算
DOUBLE(M,D)±2.225E-308 ~ ±1.797E+308—8B雙精度科學/金融
DECIMAL(M,D)精確定點,M≤65,D≤30—M+2B貨幣、精確計量(首選)

選型鐵律:滿足業務範圍的**最小類型**。
- 整數優先 UNSIGNED 獲得雙倍正向範圍
- AUTO_INCREMENT 必須配合整數類型
- 科學計算用 DOUBLE,**金融嚴禁浮點**,必用 DECIMAL

字符串列類型詳細表

類型最大長度存儲開銷特點適用場景
CHAR(M)255M 字節定長,右填充空格MD5、UUID、郵編、ISO 代碼
VARCHAR(M)65,535L+1/2 字節變長,1-2B 存長度通用文本、姓名、地址
TINYTEXT/BLOB255L+1不指定長度極短備註、縮略圖
TEXT/BLOB64 KBL+2—文章、日誌、中等圖片
MEDIUMTEXT/BLOB16 MBL+3—長文檔、大圖片
LONGTEXT/BLOB4 GBL+4—超大對象、視頻切片
ENUM('v1','v2',...)65,535 成員1-2B單選,內部存數字狀態機、類別、性別
SET('v1','v2',...)64 成員1-8B多選,位圖存儲標籤、權限掩碼

關鍵差異:
- BLOB 二進制比較、TEXT 字符集比較
- VARCHAR 受行大小限制(65,535 字節共享),超長改 TEXT
- ENUM/SET 成員變更需 ALTER TABLE,慎用於高頻變更場景

日期時間列類型詳細表

類型格式範圍存儲特殊行為
DATEYYYY-MM-DD1000-01-01 ~ 9999-12-313B—
TIMEHH:MM:SS[.fsp]-838:59:59 ~ 838:59:593B+可存時長、負值
DATETIMEYYYY-MM-DD HH:MM:SS[.fsp]1000-01-01 ~ 9999-12-315-8B5.6.4+ 支持微秒
TIMESTAMPYYYY-MM-DD HH:MM:SS[.fsp]1970-01-01 UTC ~ 2038-01-19 UTC4-7B**時區感知**,寫入自動轉 UTC,讀取轉會話時區
YEARYYYY1901 ~ 21551B1 字節極省空間

選型建議:
- 需時區自動轉換(多地域應用)→ TIMESTAMP
- 歷史/未來日期、生日、審計時間 → DATETIME
- 僅需日期/時間 → DATE/TIME 省空間
- 5.6.4+ 指定 DATETIME(3) 存毫秒,TIMESTAMP(3) 存微秒

列屬性與約束

屬性適用類型作用
UNSIGNED整數/浮點禁用負值,正向範圍翻倍
ZEROFILL數值左補 0 至顯示寬度,隱含 UNSIGNED
BINARYCHAR/VARCHAR/TEXT二進制比較,區分大小寫,加速索引
NULL / NOT NULL所有是否允許 NULL,NOT NULL 利於優化器
DEFAULT value除 BLOB/TEXT隱式插入默認值,CURRENT_TIMESTAMP 支持時間類型
AUTO_INCREMENT整數自增主鍵,每表僅一列
COMMENT 'str'所有列註釋,SHOW FULL COLUMNS 可見

實戰建表範例

CREATE TABLE `student` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name`        VARCHAR(20)  NOT NULL DEFAULT '' COMMENT '姓名',
  `chinese`     TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '語文',
  `maths`       TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '數學',
  `english`     TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '英語',
  `birthday`    DATE         NOT NULL COMMENT '出生日期',
  `created_at`  TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `updated_at`  TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_birthday` (`birthday`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='學生成績表';

避坑清單

  1. VARCHAR(255) 濫用 → 實際長度評估後定義
  2. FLOAT/DOUBLE 存金額 → **必用 DECIMAL(19,4)**
  3. TIMESTAMP 2038 年問題 → 長期項目改 DATETIME
  4. ENUM 成員頻繁變更 → 改 VARCHAR + 字典表
  5. 缺失 NOT NULL + DEFAULT → 導致 NULL 汙染、統計失真
  6. 字符集不統一 → 全鏈路 utf8mb4,避免隱式轉換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved