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

MySQL數據類型與表字段約束完整指南

     編輯:MySQL 綜合教學

MySQL數據類型與表字段約束完整指南

合理選擇數據類型與約束,是數據庫設計性能與數據質量的基石。本文系統梳理MySQL支持的數據類型、字段屬性約束及建表最佳實踐。

一、數據類型詳解

1. 數值類型

類型存儲範圍(有符號)存儲範圍(無符號)字節適用場景
TINYINT-128 ~ 1270 ~ 2551年齡、狀態碼、布爾值
SMALLINT-32768 ~ 327670 ~ 655352小範圍計數
MEDIUMINT-8388608 ~ 83886070 ~ 167772153中等計數
INT/INTEGER-2147483648 ~ 21474836470 ~ 42949672954通用ID、計數器
BIGINT-2^63 ~ 2^63-10 ~ 2^64-18大數據量ID、時間戳
FLOAT(M,D)單精度浮點數-4科學計算、非精確值
DOUBLE(M,D)雙精度浮點數-8高精度科學計算
DECIMAL(M,D)精確定點數-M+2貨幣、金融、精確計算首選

關鍵點:

  • M為顯示寬度,D為小數位數。FLOAT(3,1)範圍-99.9~99.9
  • 整型可加UNSIGNED擴大正數範圍;浮點/定點數不可用
  • DECIMAL必須指定M,D;FLOAT/DOUBLE可選
  • 原則:滿足範圍前提下,選擇最小類型(如年齡用TINYINT(3))

2. 字符串類型

類型最大長度存儲特點適用場景
CHAR(M)255字符固定長度,右補空格定長代碼(如MD5、UUID、郵編)
VARCHAR(M)65,535字節實際長度+1/2字節長度前綴變長文本(姓名、標題、郵箱)
TINYTEXT255字節不指定長度極短文本
TEXT64KB-較長文本
MEDIUMTEXT16MB-長文本
LONGTEXT4GB-超長文本
BLOB系列對應TEXT二進制存儲圖片、文件、序列化對象

關鍵點:

  • CHAR按定長存儲,VARCHAR按實際長度+長度前綴存儲
  • 推薦使用VARCHAR或NVARCHAR(Unicode),避免TEXT類型(讀取效率低、難建索引)
  • MySQL 5.0+ 推薦VARCHAR(MAX)替代TEXT

3. 日期時間類型

類型範圍字節格式備註
DATE1000-01-01 ~ 9999-12-313YYYY-MM-DD純日期
TIME-838:59:59 ~ 838:59:593HH:MM:SS純時間
DATETIME1000-01-01 00:00:00 ~ 9999-12-31 23:59:598YYYY-MM-DD HH:MM:SS日期時間,無時區
TIMESTAMP1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC4YYYY-MM-DD HH:MM:SS帶時區自動轉換,受2038年問題限制
YEAR1901 ~ 21551YYYY年份

實踐建議:PHP常用INT存儲Unix時間戳,應用層格式化;MySQL 5.6.4+ DATETIME支持微秒且無2038年問題,優先選擇。

二、表字段約束與屬性

1. 主鍵

PRIMARY KEY (column_name)
  • 唯一標識每行,非空、唯一
  • 一張表僅能有一個主鍵(可為復合主鍵)
  • 建議:無業務含義、系統自增、永不更新、不含動態數據

2. 外鍵

FOREIGN KEY (uid) REFERENCES user(uid)
  • 維護表間引用完整性,防止孤兒數據
  • 主表(被引用表)必須有主鍵/唯一索引
  • 從表(引用表)定義外鍵
  • 刪除主表記錄前,必須先刪除從表關聯記錄

3. 自動遞增

uid MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT
  • 僅限整數類型
  • 隱含非空、唯一,無需額外定義
  • 插入時可省略或指定NULL/0觸發自增

4. 非空與默認值

username CHAR(20) NOT NULL DEFAULT ''
regdate INT(10) UNSIGNED NOT NULL DEFAULT 0
  • NOT NULL防止意外空值,配合DEFAULT簡化插入語句
  • 修改:ALTER TABLE user CHANGE username username CHAR(20) NULL(去掉非空)

5. 唯一性約束

UNIQUE KEY username (username)
-- 添加/刪除
ALTER TABLE tb_name ADD UNIQUE (column_name);
ALTER TABLE tb_name DROP INDEX column_name;
  • 主鍵自動包含唯一約束,無需重複定義
  • 允許多個NULL值(標準SQL規範)

6. 索引

KEY email (email)
-- 等同於
INDEX email (email)
  • 加速查詢,代價是寫入性能與存儲空間
  • 為經常出現在WHERE、JOIN、ORDER BY的列建立索引

三、綜合建表最佳實踐範例

CREATE TABLE `user` (
  `uid` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` CHAR(15) NOT NULL DEFAULT '',
  `password` CHAR(32) NOT NULL DEFAULT '',
  `email` VARCHAR(40) NOT NULL DEFAULT '',
  `regdate` INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`uid`),
  UNIQUE KEY `username` (`username`),
  KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

表選項說明:

  • ENGINE=MyISAM:高性能、無事務、全文索引;InnoDB:事務、行鎖、外鍵
  • CHARSET=utf8:國際通用編碼,避免亂碼
  • AUTO_INCREMENT=1:自增起始值

四、選型決策速查表

業務場景推薦類型約束建議
用戶IDBIGINT UNSIGNEDPK + AUTO_INCREMENT
手機號CHAR(11)UNIQUE + NOT NULL
郵箱VARCHAR(100)UNIQUE + INDEX
密碼哈希CHAR(60) (bcrypt)NOT NULL
金額/價格DECIMAL(10,2)NOT NULL + DEFAULT 0.00
狀態枚舉TINYINT UNSIGNEDNOT NULL + DEFAULT 1 + CHECK
創建時間DATETIME / TIMESTAMPNOT NULL + DEFAULT CURRENT_TIMESTAMP
長文本/文章LONGTEXT / VARCHAR(MAX)-
圖片/二進制LONGBLOB / 存儲路徑建議存路徑,文件存對象存儲

遵循「最小足夠原則」選擇類型,配合完整約束體系,構建高性能、高可靠的數據庫基礎架構。

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