在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”表示同時擁有讀和寫權限。

六、如何選擇數據類型?

  1. 優先選最小類型:能用TINYINT不用INT,節省空間(如年齡TINYINT UNSIGNED足夠覆蓋0-255歲)。
  2. 固定長度優先:短文本(如性別)用CHAR,長文本(如內容)用TEXT
  3. 根據業務場景
    - 手機號用VARCHAR(11)INT存不下11位數字);
    - 訂單ID用INTBIGINT(需避免溢出);
    - 金額用DECIMAL(10,2)(避免浮點數誤差)。
  4. 避免過度設計:ID用INT足夠時,別用BIGINT;狀態字段用TINYINT(1)ENUM更簡單。
  5. 禁止NULL濫用:主鍵/唯一字段必須NOT NULL,允許爲空的字段用默認值(如年齡默認0)。

七、常見錯誤總結

  • ❌ 用INT存手機號(11位數字超過INT範圍);
  • ❌ 用CHAR(255)存長文本(浪費空間且效率低);
  • ❌ 用DATE存當前時間(需用DATETIMETIMESTAMP);
  • ❌ 用VARCHAR存ID(INT查詢更快,且更規範)。

結語

數據類型是MySQL的基礎,選對類型能讓表結構更合理、查詢更快、數據更安全。新手可先從“整數+短文本+日期”三大類入手,熟練後再學習ENUMSET等進階類型。多實踐、多觀察生產環境的表結構,就能逐漸掌握類型選擇的技巧。

小夜