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

MySQL 數據類型深度解析:字符串、整數、小數選型避坑指南

     編輯:MySQL 綜合教學

MySQL 數據類型深度解析:字符串、整數、小數選型避坑指南

數據類型選型直接影響儲存空間、索引效能、查詢精度與應用邏輯正確性。本文針對 MySQL 5.5+ 版本,深度剖析字符串(CHAR/VARCHAR/ENUM)、整數家族、浮點/定點數的選型原則與常見誤區。

一、字符串類型

1. CHAR vs VARCHAR:固定長 vs 變長的本質權衡

特性CHAR(M)VARCHAR(M)
儲存方式固定 M 字符,不足右補空格實際長度 + 1/2 字節長度前綴
最大長度0~255 字符0~65,535 字符(受行大小 65,535 字節限制)
截斷行為嚴格模式:尾部空格截斷警告;非嚴格:靜默截斷同左
索引效能固定長度,比較/排序快變長,需額外讀取長度前綴
適用場景長度固定/近似固定(MD5、UUID、手機號、身份證、學號)長度變化大(姓名、地址、描述、JSON 片段)

VARCHAR 最大長度陷阱

MySQL 單行上限 65,535 字節。UTF8MB4 下單字符最多 4 字節,故 VARCHAR(65535) 會報錯 Column length too big,實際上限約 16383。實測:


CREATE TABLE t (c VARCHAR(65535)) CHARSET=utf8mb4; -- Error 1074
CREATE TABLE t (c VARCHAR(16383)) CHARSET=utf8mb4; -- OK

2. ENUM:枚舉類型的空間與效能雙贏


CREATE TABLE country (
  place ENUM('Japan','China','Russia','Brazil','America')
);
INSERT INTO country VALUES ('China');  -- 實際儲存 1 字節索引值 2
  • 儲存 1-2 字節索引而非字符串,海量行節省空間顯著;
  • 嚴格模式下非法值報錯,非嚴格模式存空串 ''(索引 0);
  • 禁用數值字符串作枚舉值(如 '1','2','3'),MySQL 內部易混淆導致不可預期結果;
  • 排序按定義順序而非字符順序。

二、整數類型家族

類型字節有符號範圍無符號範圍典型用途
TINYINT1-128 ~ 1270 ~ 255布爾標誌、極小計數
SMALLINT2-32,768 ~ 32,7670 ~ 65,535較小計數、狀態碼
MEDIUMINT3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等計數、IPv4 存儲
INT / INTEGER4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295通用主鍵、外鍵、計數器
BIGINT8-9.22E18 ~ 9.22E180 ~ 1.84E19海量主鍵、時間戳毫秒、雪花算法 ID
  • UNSIGNED 將負數空間轉給正數,範圍翻倍;
  • ZEROFILL 自動補 0 顯示(如 INT(5) ZEROFILL 插入 42 顯示 00042),不影響儲存;
  • INT(11) 中的 11 僅為顯示寬度提示,**不限制儲存範圍**。

三、小數類型:浮點數 vs 定點數

FLOAT / DOUBLE(浮點數,近似值)

  • FLOAT:4 字節,單精度,約 7 位有效數字;
  • DOUBLE:8 字節,雙精度,約 15 位有效數字;
  • 可指定精度:FLOAT(M,D)、DOUBLE(M,D),M=總位數,D=小數位;
  • 嚴禁用於精確計算(金額、庫存):SELECT 0.1 + 0.2 = 0.3 為 FALSE。

DECIMAL / NUMERIC(定點數,精確值)

  • 以字符串形式儲存,每 9 位數字壓縮為 4 字節;
  • DECIMAL(M,D):M 最大 65,D 最大 30;
  • 金融、價格、庫存、比率等精確計算唯一選擇;
  • 運算較浮點數慢,但精度有保障。

選型決策樹

  1. 整數計數/標識 → TINYINT/SMALLINT/INT/BIGINT + UNSIGNED;
  2. 精確小數(金額) → DECIMAL(M,D);
  3. 科學計算/近似值 → DOUBLE;
  4. 固定長字符(MD5/UUID/手機號) → CHAR;
  5. 變長字符 → VARCHAR + 合理長度上限;
  6. 固定集合狀態(性別、訂單狀態、支付方式) → ENUM 或 TINYINT + 應用層常量映射。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved