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

MySQL 資料型別與建表策略深度解析:從整數到 TEXT 的最佳選擇

     編輯:MySQL 資料庫相關知識

一、數值型別:精打細算每一個位元組

1. 整數家族:依最大值選最小型別

型別儲存無號最大值適用場景
TINYINT1 Byte255年齡、狀態碼、布林旗標
SMALLINT2 Bytes65,535技能值、小型分類 ID
MEDIUMINT3 Bytes16,777,215千萬級自增 ID、中型統計計數
INT4 Bytes4,294,967,295通用自增 ID、大多數外鍵
BIGINT8 Bytes18,446,744,073,709,551,615極大量資料、分散式 ID、時間戳毫秒

實戰原則:1000 萬列表用 MEDIUMINT 代替 INT 可省 ~30MB;UNSIGNED 翻倍正數範圍,無負數業務必加。

2. 定點數 DECIMAL/NUMERIC:金額的唯一正解

  • 以字串形式逐位儲存,精度固定、運算不失真。
  • 每位數字(含小數點)佔 1 Byte,空間較大但值得。
  • 定義 DECIMAL(10,2) 表總 10 位、小數 2 位,適合價格、薪資、帳務。

3. 浮點數 FLOAT/DOUBLE:科學計算專用

  • FLOAT 4 Bytes,精度 ~7 位有效數字,範圍 ±1.17E-38 ~ ±3.4E+38。
  • DOUBLE 8 Bytes,精度 ~15 位,範圍 ±2.22E-308 ~ ±1.8E+308。
  • 嚴禁用於金額:0.1 + 0.2 != 0.3 經典誤差。僅用於物理模擬、科學統計等容許誤差場景。

二、日期時間型別:選對不浪費

型別儲存範圍適用場景
DATE3 Bytes1000-01-01 ~ 9999-12-31生日、入職日、訂單日期
TIME3 Bytes-838:59:59 ~ 838:59:59每日排班、營業時段
DATETIME8 Bytes1000-01-01 00:00:00 ~ 9999-12-31 23:59:59建立/更新時間、精確到秒的事件
TIMESTAMP4 Bytes1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC自動記錄建立/更新時間、跨時區應用
YEAR1 Byte1901 ~ 2155年份統計、車款年份

選擇指南:只需日期用 DATE;需時區轉換用 TIMESTAMP;一般業務時間用 DATETIME;TIMESTAMP 2038 年問題需評估長期專案風險。

三、字串型別:固定 vs 變長的空間博弈

型別長度特性實際儲存適用場景
CHAR(N)固定 N 字元N BytesMD5 雜湊(32)、UUID(36)、國碼(2)、固定代碼
VARCHAR(N)變長 ≤ N實際長度 + 1~2 Bytes姓名、標題、Email、不定長代碼
TINYTEXT≤ 255 字元實際長度 + 1 Byte短備註、標籤
TEXT≤ 65,535 字元實際長度 + 2 Bytes文章內容、商品描述
MEDIUMTEXT≤ 16,777,215 字元實際長度 + 3 Bytes長文檔、日誌
LONGTEXT≤ 4,294,967,295 字元實際長度 + 4 Bytes極大文本、完整網頁

關鍵決策邏輯

  1. 長度固定且接近上限 → CHAR(如股票代碼 6 碼,上海多數用 CHAR(6) 比 VARCHAR(6) 省空間)。
  2. 長度變化大、平均遠小於上限 → VARCHAR。
  3. 超過 255 字元 → 直接用 TEXT 家族,勿用巨大 VARCHAR。
  4. VARCHAR 長度 1~255 用 1 Byte 儲存長度,256~65535 用 2 Bytes。

四、ENUM 與 SET:特定場景的效能利器

ENUM(單選)

  • 最多 65,535 個元素,儲存 1~2 Bytes(索引值)。
  • 適合:性別、狀態('pending','paid','shipped','cancelled')、優先級。
  • 查詢時自動轉為字串,ORDER BY 依定義順序排序。

SET(多選)

  • 最多 64 個元素,儲存 1~8 Bytes(位元遮罩)。
  • 適合:標籤、權限位元組、多重屬性('red','green','blue' 可同時存 'red,blue')。
  • FIND_IN_SET()、& 位元運算查詢極快,可替代多對多關聯表。

五、建表策略黃金法則

  1. 主鍵盡量用無意義自增整數(BIGINT UNSIGNED AUTO_INCREMENT),避免業務鍵變更導致叢集索引重組。
  2. 所有表預設字元集 utf8mb4,支援 Emoji 與完整 Unicode。
  3. NOT NULL 默認,必要時給 DEFAULT;NULL 會額外佔用位元圖空間並複雜化優化器判斷。
  4. 索引覆蓋查詢:EXPLAIN 確認 Using index,避免回表。
  5. 大欄位拆分:TEXT/BLOB 獨立副表,主表只存核心欄位,提升掃描效能。
  6. 外鍵謹慎使用:高併發下鎖競爭嚴重,應用層維護參考完整性常更彈性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved