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

MySQL欄位型別完整圖鑑:數值、字串、日期時間三大類型深度解析與選型指南

     編輯:MySQL 資料庫相關知識

MySQL表由一或多個欄位組成,每欄位有特定型別決定儲存與運算語意。型別分三大類:數值類、字串類、日期/時間類。本文系統解析各型別範圍、儲存空間、屬性與選型原則。

一、數值類型別

整數型

型別儲存有號範圍無號範圍
TINYINT1B-128~1270~255
SMALLINT2B-32768~327670~65535
MEDIUMINT3B-8388608~83886070~16777215
INT4B-2147483648~21474836470~4294967295
BIGINT8B-9223372036854775808~92233720368547758070~18446744073709551615

INT(M)顯示寬度**不影響**儲存與範圍,UNSIGNED禁止負數。

浮點數型

型別儲存精度說明
FLOAT4B單精度,±1.17E-38 ~ ±3.40E+38
DOUBLE8B雙精度,±2.22E-308 ~ ±1.79E+308
DECIMAL(M,D)M+2B字串儲存,**精確十進位**,無四捨五入誤差,適合財務

4.0.2+支援FLOAT/DOUBLE UNSIGNED(僅移除負號部分)。M顯示寬度,D小數位。DECIMAL預設M=10,D=0。CPU無法直接運算DECIMAL,效率較低。

數值屬性

  • ZEROFILL:不足顯示寬度左補0(隱含UNSIGNED)。
  • AUTO_INCREMENT:整數型專用自增序列。
  • NULL/NOT NULL、DEFAULT。

二、字串類型別

型別最大長度儲存空間備註
CHAR(M)M bytesM bytes固定長,右補空格
VARCHAR(M)M bytesL+1 bytes可變長,L=實際長度
TINYBLOB/TEXT255 bytesL+1
BLOB/TEXT64KBL+2
MEDIUMBLOB/TEXT16MBL+3
LONGBLOB/TEXT4GBL+4
ENUM65535成員1-2B單值,內部以數值儲存
SET64成員1-8B多值,位元遮罩儲存

二進位 vs 非二進位字串

  • 二進位:BLOB、BINARY屬性CHAR/VARCHAR。按**byte值**比較/排序,**區分大小寫**,與字元集無關。
  • 非二進位:TEXT、無BINARY屬性CHAR/VARCHAR。按**字元集排序規則**比較,**通常不區分大小寫**。

CHAR vs VARCHAR 選型原則

  1. 長度固定 → CHAR(避免VARCHAR額外1 byte長度欄位)。
  2. 長度不一 → VARCHAR節省空間。
  3. MyISAM/ISAM處理固定長列效率高 → 傾向CHAR。
  4. 表中**任一**可變長欄位 → **全表轉為可變長行格式**(CHAR<4例外不轉)。

BLOB/TEXT 索引與碎片

  • MyISAM 3.23.2+、BDB支援索引;ISAM/HEAP/InnoDB**不支援**。
  • 大物件刪改易產生碎片 → 定期OPTIMIZE TABLE。
  • 超大值需調大max_allowed_packet與客戶端封包大小。

ENUM/SET 內部儲存

  • ENUM:宣告順序編號從1開始。
  • SET:成員對應bit位(第1個→bit0,第2個→bit1...),多值並存透過位元組合。

三、日期/時間類型別

型別範圍儲存零值
DATE1000-01-01 ~ 9999-12-313B0000-00-00
TIME-838:59:59 ~ 838:59:593B00:00:00
DATETIME1000-01-01 00:00:00 ~ 9999-12-31 23:59:598B0000-00-00 00:00:00
TIMESTAMP1970-01-01 00:00:00 ~ 2037年4B00000000000000
YEAR(4)1901~21551B0000
YEAR(2)1970~20691B00

TIMESTAMP 自動特性

  • 插入NULL → 自動設為當前日期時間。
  • 建立/修改行時未顯式賦值 → 第一個TIMESTAMP欄自動設為當前時間。
  • 顯式賦值 → **失效**自動特性。
  • 顯示寬度不影響儲存(固定4B、14位精度)。

雙 TIMESTAMP 記錄建立與修改時間

CREATE TABLE t (
    create_ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

注意:update_ts必須置於create_ts**之前**才會自動更新(舊版本行為),新版建議用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP語法。

YEAR 兩位數轉四位規則

  • 00-69 → 2000-2069
  • 70-99 → 1970-1999
  • 00 → 0000(非2000),因0是合法值。

完整掌握三大類型別特性,能在建模階段做出最適合業務與效能的型別決策,避免後期昂貴的ALTER TABLE重構。

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