在MySQL中,數據類型就像給數據“貼標籤”,不同的標籤決定了數據如何存儲、佔用多少空間,以及能做什麼操作。選對數據類型,不僅能讓數據庫更高效、節省存儲空間,還能避免數據錯誤和溢出。對於新手來說,掌握基礎數據類型的選擇是入門MySQL的第一步。
一、爲什麼要重視數據類型?¶
選錯數據類型的後果可能很嚴重:比如用INT存手機號(11位數字,INT最大僅支持10位左右),會導致數據溢出;用CHAR(20)存短名字(如“張三”),會浪費19個空格的存儲空間。因此,瞭解數據類型是寫好SQL的基礎。
二、數值類型:數字怎麼存?¶
數值類型是最常用的數據類型,分爲整數、浮點數和定點數,各有適用場景。
1. 整數類型¶
-
TINYINT:1字節,範圍(有符號:-128~127;無符號:0~255)。常用於存小範圍數據,如性別(1=男,0=女)或狀態(0=禁用,1=啓用)。
注意:括號內的數字(如TINYINT(1))僅表示顯示寬度,和存儲範圍無關(TINYINT(1)和TINYINT(3)存儲大小相同)。 -
SMALLINT:2字節,範圍(有符號:-32768~32767;無符號:0~65535)。適合中等範圍數據,如年齡(假設年齡最大100歲)。
-
INT(INTEGER):4字節,最常用的整數類型,範圍(有符號:-2147483648~2147483647;無符號:0~4294967295)。適合用戶ID、訂單編號等。
-
BIGINT:8字節,範圍(有符號:-9223372036854775808~9223372036854775807;無符號:0~18446744073709551615)。僅用於超大數據量場景,如千萬級用戶ID。
-
無符號整數:加
UNSIGNED表示非負數,如TINYINT UNSIGNED可存0~255,避免負數浪費空間(如年齡TINYINT UNSIGNED足夠覆蓋0~255歲)。
2. 浮點數類型¶
用於存儲小數,如價格、身高、體重。
-
FLOAT:4字節,精度低(約7位有效數字),適合精度要求不高的場景,如溫度(
FLOAT(5,2)表示最多5位,2位小數,範圍-999.99~999.99)。 -
DOUBLE:8字節,精度高(約15位有效數字),適合精度要求較高的場景,如考試分數(
DOUBLE(4,2)表示4位總長度,2位小數,範圍-99.99~99.99)。 -
注意:浮點數可能存在精度誤差(如
0.1+0.2=0.30000000000000004),對金融數據(如金額)需用定點數。
3. 定點數類型¶
- DECIMAL(M,D):存儲高精度小數,
M總位數,D小數位數,如DECIMAL(10,2)表示“10位數字,2位小數”(範圍由M決定,可精確到小數點後30位)。
適用場景:金額(如訂單價格)、銀行數據等需要精確計算的字段。
三、字符串類型:文本怎麼存?¶
字符串類型分爲固定長度和可變長度,需根據文本長度選擇。
1. 固定長度:CHAR(M)¶
CHAR(M):M爲固定長度(1~255字節),不足補空格,適合短且固定的文本。
適用場景:性別(CHAR(1)存“男/女”)、郵政編碼(CHAR(6))、固定長度的手機號前綴等。
優點:存儲效率高,查詢速度快;缺點:浪費空間(如存“張”會補24個空格到CHAR(25))。
2. 可變長度:VARCHAR(M)¶
VARCHAR(M):M爲最大長度(1~65535字節,取決於字符集),只存實際內容(不補空格),適合長度不固定的文本。
適用場景:名字(VARCHAR(50))、郵箱(VARCHAR(100))、地址(VARCHAR(200))等。
優點:節省空間;缺點:比CHAR多1-2字節存儲長度(如果長度超過255字節,還需額外字節記錄長度)。
3. 超長文本:TEXT¶
TEXT:無固定長度限制(最大65535字節),用於存儲長文本,如文章內容、評論、備註等。
注意:TEXT不可加默認值,且需配合VARCHAR使用——短文本用VARCHAR,長文本用TEXT。
四、日期時間類型:時間怎麼存?¶
MySQL提供多種時間類型,需根據需求選擇:
1. DATE:僅存日期¶
- 格式:
YYYY-MM-DD,範圍:1000-01-01~9999-12-31。
適用場景:生日、入職日期等只需要日期的字段。
2. DATETIME:存日期+時間¶
- 格式:
YYYY-MM-DD HH:MM:SS,範圍:1000-01-01~9999-12-31,佔用8字節。
適用場景:訂單創建時間、會議開始時間等需要完整日期時間的字段。
3. TIMESTAMP:時間戳(自動更新)¶
- 格式:
YYYY-MM-DD HH:MM:SS,範圍:1970-01-01 00:00:01~2038-01-19 03:14:07(32位時間戳),佔用4字節。
特點: - 自動隨服務器時間更新(如
ON UPDATE CURRENT_TIMESTAMP); - 佔用空間小,適合記錄時效性強的數據(如用戶登錄時間、訂單支付時間)。
五、其他常用類型¶
1. 布爾類型(TINYINT替代)¶
MySQL沒有專門的BOOLEAN類型,用TINYINT(1)表示“真/假”:
- 0=假(FALSE),1=真(TRUE),常用於狀態字段(如“是否啓用”)。
2. 枚舉類型(ENUM)¶
ENUM('男','女'):只能從預設列表中選1個值,避免輸入錯誤(如性別字段用ENUM更規範)。
示例:status ENUM('active','inactive'),存“active”或“inactive”。
3. 集合類型(SET)¶
SET('A','B','C'):可從預設列表中選多個值(用逗號分隔),適合多選場景。
示例:permission SET('read','write','delete'),存“read,write”表示同時擁有讀和寫權限。
六、如何選擇數據類型?¶
- 優先選最小類型:能用
TINYINT不用INT,節省空間(如年齡TINYINT UNSIGNED足夠覆蓋0-255歲)。 - 固定長度優先:短文本(如性別)用
CHAR,長文本(如內容)用TEXT。 - 根據業務場景:
- 手機號用VARCHAR(11)(INT存不下11位數字);
- 訂單ID用INT或BIGINT(需避免溢出);
- 金額用DECIMAL(10,2)(避免浮點數誤差)。 - 避免過度設計:ID用
INT足夠時,別用BIGINT;狀態字段用TINYINT(1)比ENUM更簡單。 - 禁止NULL濫用:主鍵/唯一字段必須
NOT NULL,允許爲空的字段用默認值(如年齡默認0)。
七、常見錯誤總結¶
- ❌ 用
INT存手機號(11位數字超過INT範圍); - ❌ 用
CHAR(255)存長文本(浪費空間且效率低); - ❌ 用
DATE存當前時間(需用DATETIME或TIMESTAMP); - ❌ 用
VARCHAR存ID(INT查詢更快,且更規範)。
結語¶
數據類型是MySQL的基礎,選對類型能讓表結構更合理、查詢更快、數據更安全。新手可先從“整數+短文本+日期”三大類入手,熟練後再學習ENUM、SET等進階類型。多實踐、多觀察生產環境的表結構,就能逐漸掌握類型選擇的技巧。