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

MySQL 欄位類型儲存空間完整對照表:整數、浮點、日期、字串、二進位

     編輯:MySQL 資料庫相關知識

數值類型儲存需求

類型儲存空間範圍 (有號)範圍 (無號)適用場景
TINYINT1 Byte-128 ~ 1270 ~ 255布爾旗標、狀態碼、極小計數
SMALLINT2 Bytes-32,768 ~ 32,7670 ~ 65,535年齡、年份、中小計數
MEDIUMINT3 Bytes-8,388,608 ~ 8,388,6070 ~ 16,777,215中等計數、RGB 色碼
INT / INTEGER4 Bytes-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295通用 ID、計數器、外鍵
BIGINT8 Bytes-9.22e18 ~ 9.22e180 ~ 1.84e19大數據量主鍵、時間戳毫秒
FLOAT4 Bytes±1.17e-38 ~ ±3.40e38—單精度科學計算、座標
DOUBLE / REAL8 Bytes±2.22e-308 ~ ±1.79e308—雙精度科學計算
DECIMAL(M,D) / NUMERICM+2 Bytes (D<M)
約每 9 位數 4 Bytes
精確定點數,最大 65 位數—金額、價格、比率 (必須精確)
BIT(M)約 (M+7)/8 Bytes位元向量—權限位圖、特徵向量

日期時間類型

類型空間範圍精度時區感知備註
DATE3 Bytes1000-01-01 ~ 9999-12-31天否生日、截止日
TIME3 Bytes + 小數-838:59:59 ~ 838:59:59秒/微秒否持續時間、工時
YEAR1 Byte1901 ~ 2155年否年份欄位
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秒/微秒是自動更新、跨時區系統

關鍵差異:TIMESTAMP 儲存為 UTC,讀取時轉換為會話時區;DATETIME 字面儲存,不隨時區變化。5.6.4+ 兩者皆支援微秒精度 (fsp 0-6)。

字串與二進位類型

類型最大長度儲存開銷字符集支援適用場景
CHAR(M)255 字符M × 字符集最大字節數 (固定)是定長代碼 (ISO 國家碼、MD5 雜湊)
VARCHAR(M)65,535 字符 (共享 64KB 行上限)L + 1/2 字節 (L=實際長度)是變長文字、姓名、標題
TINYTEXT255 字符L + 1 字節是極短文本
TEXT64 KBL + 2 字節是文章、描述
MEDIUMTEXT16 MBL + 3 字節是長文檔
LONGTEXT4 GBL + 4 字節是巨大文本、JSON 文檔
BINARY(M)255 字節M 字節 (固定)否 (二進位)固定長二進位 (UUID、雜湊)
VARBINARY(M)65,535 字節L + 1/2 字節否變長二進位 (加密資料、圖片縮圖)
TINYBLOB ~ LONGBLOB同 TEXT 階層同 TEXT否二進位大物件 (檔案、圖片)
ENUM('v1','v2',...)65,535 個值1-2 字節 (視值數量)是固定集合狀態 (性別、訂單狀態)
SET('v1','v2',...)64 個成員1/2/3/4/8 字節是多選標籤、權限組合

選型決策樹

  1. 是否為金額/精確小數? → DECIMAL(19,4) 或 DECIMAL(precision, scale)
  2. 是否需時區轉換/自動更新? → TIMESTAMP (注意 2038 年問題);否 → DATETIME(6)
  3. 長度固定且極短? → CHAR / BINARY
  4. 長度可變、需索引? → VARCHAR / VARBINARY (長度 ≤ 767 字節可建單欄索引,InnoDB 預設)
  5. 超長文本/二進位? → TEXT/BLOB 階層,**避免 SELECT ***,單獨查詢
  6. 固定枚舉值? → ENUM (單選) / SET (多選),比 VARCHAR 節省空間且隱含驗證
  7. 主鍵/外鍵? → BIGINT UNSIGNED AUTO_INCREMENT (分散式用 UUID/GUID 存 BINARY(16) 或 CHAR(36))

InnoDB 行儲存限制補充

  • 單行最大 65,535 字節 (含所有欄位開銷),TEXT/BLOB 只存 20 字節指標在本地頁面,實際資料存溢出頁
  • VARCHAR(65535) 實際最大長度取決於字符集:utf8mb4 約 16,383 字符 (65535/4 - 1~2 字節長度前綴)
  • 行溢出閾值:innodb_page_size (預設 16KB) 的 1/2 ≈ 8KB,超過即移至溢出頁

效能與空間優化實戰

-- 1. 將 TINYINT(1) 布爾欄位改為 BIT(1) 節省 7 個位元 (但應用層處理較麻煩)
-- 2. 郵遞區號、手機號碼用 CHAR(5)/CHAR(11) 而非 VARCHAR
-- 3. 刪除未用索引:每個索引約佔 1 倍資料大小
-- 4. 使用 COMPRESSED 行格式 (ROW_FORMAT=COMPRESSED, KEY_BLOCK_SIZE=8) 壓縮 TEXT/BLOB
-- 5. 定期 OPTIMIZE TABLE 回收碎片空間 (僅 InnoDB file_per_table=ON 有效)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved