首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 核心數據類型深度解析:整數、浮點、定點、日期時間、字符串、二進制、枚舉、集合、位類型

     編輯:MySQL 綜合教學

數值類型

整數類型

類型存儲字節有符號範圍無符號範圍典型場景
TINYINT1-128 ~ 1270 ~ 255布爾標誌、極小計數
SMALLINT2-32,768 ~ 32,7670 ~ 65,535較小範圍計數、狀態碼
MEDIUMINT3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等計數、IPv4 存儲 (INT UNSIGNED 更常用)
INT / INTEGER4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295通用主鍵、計數器、外鍵
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1海量主鍵、時間戳毫秒、雪花 ID

提示:INT(N) 中的 N 僅影響顯示寬度 (配合 ZEROFILL),不限制存儲範圍。5.0.67+ 已棄用 ZEROFILL,建議應用層格式化。

定點數 DECIMAL / NUMERIC

  • 精確存儲,適合金額、匯率、精密測量。
  • 語法:DECIMAL(M, D) M=總位數(1~65),D=小數位數(0~30, D≤M)。
  • 存儲:每 9 位數字佔 4 字節,餘數按下表佔用字節。
    剩餘位數字節
    00
    1~21
    3~42
    5~63
    7~94
  • 示例:DECIMAL(20,6) → 整數部 14 位 (5+9) 佔 3+4=7 字節,小數部 6 位佔 3 字節,共 10 字節。

浮點數 FLOAT / DOUBLE

類型字節精度範圍近似適用性
FLOAT(M,D)4~7 位有效數字±3.4E38科學計算、非精確容差場景
DOUBLE(M,D)8~15 位有效數字±1.7E308雙精度科學計算

警告:浮點數存在精度誤差,嚴禁用於金融金額,務必用 DECIMAL。

日期時間類型

類型字節範圍精度時區感知典型用途
DATE31000-01-01 ~ 9999-12-31天否生日、入職日期、業務日期
TIME3-838:59:59 ~ 838:59:59秒 (可微秒)否時間段、每日定時、耗時統計
YEAR11901 ~ 2155 (4位)年否年份維度統計
DATETIME8 (5.6.4 前)1000-01-01 00:00:00 ~ 9999-12-31 23:59:59秒 (5.6.4+ 支持微秒)否業務時間、日志記錄、不需時區轉換
TIMESTAMP41970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC秒 (5.6.4+ 支持微秒)是 (存儲 UTC,讀取按會話時區轉換)創建/更新時間戳、跨時區應用

微秒精度語法 (MySQL 5.6.4+)

TYPE_NAME(fsp),fsp=0~6。如 DATETIME(3) 毫秒級,TIMESTAMP(6) 微秒級。

函數同步支持:NOW(3)、CURTIME(6)、SYSDATE(3)。

字符串類型

類型最大長度存儲特點適用場景
CHAR(N)255 字符定長,右填充空格至 N固定長度代碼、MD5、UUID、ISO 代碼
VARCHAR(N)65,535 字節 (行上限共享)變長,1~2 字節長度前綴 + 實際內容通用變長文本、姓名、地址、JSON 片段
TEXT64 KB溢出頁存儲,不在行內長文本、文章、日志詳情
MEDIUMTEXT16 MB同上較長文檔
LONGTEXT4 GB同上超大文本、基因序列

關鍵差異:CHAR(4) 存 'ab' 實際佔 4 字節 ('ab '),VARCHAR(4) 佔 3 字節 (長度 1 + 'ab')。CHAR 適合極短固定長度、高頻更新列 (避免行遷移)。

二進制類型

類型對應字符類型特點
BINARY(N)CHAR(N)定長,填充 0x00
VARBINARY(N)VARCHAR(N)變長,存儲字節流
BLOB / TINYBLOB / MEDIUMBLOB / LONGBLOBTEXT 系列二進制大對象,存圖片、文件流、加密數據

比較語義:二進制類型按字節值比較,'5' = 0x35,'5\0\0' != '5' (BINARY 填充 0x00 導致不等)。

枚舉與集合

ENUM

  • 單選,最多 65,535 個元素,內部存儲為 1~2 字節整數 (索引值)。
  • 插入非列表值 → 空字符串 (索引 0) + Warning (嚴格模式報錯)。
  • 排序按索引順序,非字面值順序。

SET

  • 多選,最多 64 個元素,內部存儲為位掩碼 (BIGINT)。
  • 插入 'a,b,a' 自動去重為 'a,b';非法元素被忽略 + Warning。
  • FIND_IN_SET('a', set_col) 查詢包含關係。

位類型 BIT(M)

  • M=1~64,存儲位向量,佔 (M+7)/8 字節。
  • 插入數值自動轉二進制,SELECT BIN(bit_col+0) 可視化輸出。
  • 適用於位掩碼權限、標籤集合 (替代 SET 當元素 >64 時)。

選型決策樹

  1. 是否精確金額?→ DECIMAL
  2. 是否整數計數/主鍵?→ TINYINT/SMALLINT/INT/BIGINT (按範圍最小化)
  3. 是否日期時間?→ 需時區轉換用 TIMESTAMP,否則 DATETIME;僅日期用 DATE,僅時間段用 TIME。
  4. 是否字符文本?→ 定長極短用 CHAR,變長用 VARCHAR,超長用 TEXT/BLOB。
  5. 是否固定枚舉?→ ENUM (單選) / SET (多選 ≤64) / BIT (多選 >64)。
  6. 是否二進制流?→ VARBINARY/BLOB。

總結

合理選擇數據類型是性能優化的基石:越小越好、越簡單越好、預留擴展但不浪費。定期用 PROCEDURE ANALYSE() 或 pt-table-checksum 掃描現有表,發現類型不匹配 (如 VARCHAR(255) 存手機號) 及時 ALTER TABLE ... MODIFY COLUMN 縮容,可顯著降低存儲與內存壓力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved