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

MySQL 核心數據類型深度解析:數值、日期、字符串、枚舉集合選型指南

     編輯:MySQL 資料庫相關知識

選型核心原則

「足夠用、最小型、避免隱式轉換」 — 合適的數據類型能節省存儲、提升查詢效能、減少隱式轉換導致的索引失效。

一、數值類型

1. 整數類型 (精確值)

類型存儲有符號範圍無符號範圍典型應用
TINYINT1 字節-128 ~ 1270 ~ 255年齡、狀態碼、布爾值(0/1)、小枚舉
SMALLINT2 字節-32,768 ~ 32,7670 ~ 65,535郵編、中型計數器
MEDIUMINT3 字節-8,388,608 ~ 8,388,6070 ~ 16,777,215**自增 ID 首選** (千萬級以內業務)、中型統計
INT / INTEGER4 字節-21億 ~ 21億0 ~ 42億通用 ID、大計數器 (但常過大造成浪費)
BIGINT8 字節-922京 ~ 922京0 ~ 1844京超大數值、分布式 ID (Snowflake)、高精度時間戳

建議: 自增主鍵優先用 MEDIUMINT UNSIGNED (1600 萬) 或 INT UNSIGNED (42 億),除非確定超過範圍才用 BIGINT。**不要默認用 INT** — 3 字節 vs 4 字節,億級表每節省 1 字節可省數百 MB 存儲與內存。

2. 定點數類型 (精確值) — 價格、金額專用

  • DECIMAL(M,D) / NUMERIC(M,D):M=總位數(精度),D=小數位數(標度)
  • 存儲方式:字符串形式,每位數字佔 1 字節,小數點不佔空間
  • 優勢: 絕對精確,**財務、價格、費率務必使用**,避免浮點數誤差
  • 範例: price DECIMAL(10,2) 支援 99,999,999.99

3. 浮點數類型 (近似值)

類型存儲精度最小正值適用場景
FLOAT4 字節~7 位有效數字1.17E-38科學計算、坐標、非精確測量值
DOUBLE8 字節~15 位有效數字2.22E-308高精度科學計算、地理空間

禁忌: **絕不可用於金額計算**,0.1 + 0.2 != 0.3 在浮點數中成立。

二、日期時間類型

類型存儲範圍精度時區處理推薦場景
DATE3 字節1000-01-01 ~ 9999-12-31天無生日、入職日期、純業務日期
TIME3 字節-838:59:59 ~ 838:59:59秒 (可微秒)無每日定時任務時間、持續時長
DATETIME8 字節 (5.6.4+ 可 5+字節)1000 ~ 9999 年秒 (可微秒)**不轉換** (存什麼讀什麼)業務時間、日誌記錄、需保留原始輸入
TIMESTAMP4 字節1970-01-01 ~ 2038-01-19秒 (可微秒)**自動轉換** (存儲時轉 UTC,讀取轉會話時區)創建/更新時間戳、跨時區應用、自動更新
YEAR1 字節1901 ~ 2155年無年份篩選、年度報表

選型決策樹:

  1. 只需日期 → DATE
  2. 需日期+時間,且**不涉及時區** → DATETIME
  3. 需日期+時間,且**跨時區/自動記錄修改時間** → TIMESTAMP (注意 2038 年問題)
  4. 5.6.4+ 版本:DATETIME(3) 支援毫秒,存儲更優,推薦替代 TIMESTAMP

三、字符串類型

類型存儲特性最大長度適用場景避坑指南
CHAR(N)固定長度,不足右補空格255 字符長度固定、極短 (如 MD5 32位、UUID 36位、身份證 18位、ISO 代碼)變長數據用 CHAR 極度浪費空間並導致尾部空格比較問題
VARCHAR(N)變長,1-2 字節存長度 + 實際內容65,535 字節 (共享行上限)長度可變的文本:名稱、標題、描述、JSON 片段N 設過大影響內存臨時表效能,實際最長 200 設 200 而非 255
TEXT溢出頁存儲,指針在行內64 KB長文本:文章內容、日誌詳情不建議建索引 (需指定前綴長度),SELECT * 會讀取溢出頁
BLOB二進制 TEXT64 KB圖片、文件、加密數據同 TEXT,區別在於二進制比較、無字符集

最佳實踐:

  • 身份證、手機號、郵編等**固定長度** → CHAR
  • 姓名、地址、標題等**可變長度** → VARCHAR + 合理長度
  • 大文本 → TEXT 並拆分到擴展表,主表只存核心字段
  • 字符集統一用 utf8mb4 (支援 Emoji),排序規則 utf8mb4_general_ci 或 0900_ai_ci

四、枚舉與集合類型

ENUM (單選)

  • 最多 65,535 個元素,存儲 1-2 字節 (視元素數量)
  • 內部存儲為整數索引,查詢時自動轉字符串
  • 經典用例: 性別 ENUM('男','女')、狀態 ENUM('pending','paid','shipped','closed')
  • 優勢: 比 TINYINT 更語義化,比 VARCHAR 省空間、比較快
  • 注意: 新增值需 ALTER TABLE,排序按定義順序而非字符順序

SET (多選)

  • 最多 64 個成員,可選 0~N 個,存儲 1-8 字節 (位掩碼)
  • 經典用例: 權限標籤 SET('read','write','delete','admin')、文章標籤
  • 查詢:FIND_IN_SET('read', perm_set)、perm_set & 1 (位運算)

選型速查表

業務場景推薦類型關鍵理由
自增主鍵 (千萬級)MEDIUMINT UNSIGNED3字節,足夠大,省空間
分布式 ID / 雪花算法BIGINT UNSIGNED64位整數完美承接
商品價格 / 費率DECIMAL(10,2) / DECIMAL(5,4)精確計算,無浮點誤差
用戶年齡TINYINT UNSIGNED1字節,0-255 足夠
創建時間 (跨時區)TIMESTAMP / DATETIME(3)自動時區轉換 / 毫秒精度無2038問題
身份證號CHAR(18)固定18位,CHAR最優
文章標題VARCHAR(200)可變長度,限制合理上限
訂單狀態ENUM('created','paid','shipped','done','cancelled')語義化、緊湊、快速比較
用戶權限標籤SET('user','vip','admin','super')位掩碼高效多選
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved