MySQL 數據類型詳解:字符串、數字、日期
在 MySQL 中,選擇合適的數據類型對于數據庫的存儲效率和查詢性能至關重要。MySQL 提供了**字符串(String)、數字(Numeric)和日期(Date & Time)**三大類數據類型,每種類型又有不同的子類型,以適應不同的業務需求。
1. 字符串(String)數據類型
字符串類型用于存儲文本數據,主要分為定長(CHAR)和變長(VARCHAR),以及大文本(TEXT 和 BLOB)。
1.1 定長與變長字符串
數據類型 | 存儲方式 | 特點 | 適用場景 |
---|---|---|---|
CHAR(n) | 定長存儲(不足補空格) | 訪問速度快,占用空間固定 | 適用于固定長度的數據,如國家代碼、身份證號 |
VARCHAR(n) | 變長存儲(按需分配空間) | 節省存儲空間,但查詢時可能需要額外的存儲開銷 | 適用于長度不固定的文本,如用戶昵稱、電子郵件 |
CHAR vs. VARCHAR
- CHAR(10) 始終占用 10 個字節(不足補空格)。
- VARCHAR(10) 只存儲實際字符,最多 10 個字節,并額外占用 1-2 字節用于存儲長度信息。
一般來說:
- 短小、長度固定的文本(如國家代碼、MD5 哈希)用
CHAR
。 - 長度不固定的文本(如姓名、地址)用
VARCHAR
。
1.2 TEXT 和 BLOB
當存儲較長的文本或二進制數據時,使用 TEXT 和 BLOB 類型:
數據類型 | 最大存儲大小 | 是否區分大小寫 | 適用場景 |
---|---|---|---|
TINYTEXT | 255 字節 | ? 區分大小寫 | 短文本,如推文內容 |
TEXT | 65,535 字節(64KB) | ? 區分大小寫 | 文章內容、評論 |
MEDIUMTEXT | 16,777,215 字節(16MB) | ? 區分大小寫 | 書籍、日志記錄 |
LONGTEXT | 4GB | ? 區分大小寫 | 超長文本,如百科條目 |
TINYBLOB | 255 字節 | ? 不區分大小寫 | 小二進制數據,如圖片縮略圖 |
BLOB | 64KB | ? 不區分大小寫 | 圖片、音頻 |
MEDIUMBLOB | 16MB | ? 不區分大小寫 | 大型媒體文件 |
LONGBLOB | 4GB | ? 不區分大小寫 | 超大文件,如電影 |
TEXT vs. VARCHAR
TEXT
不支持 默認值,也無法使用 索引(僅支持前綴索引),但可以存儲大量文本。VARCHAR
可以索引整個字段,適用于需要頻繁搜索的文本字段。
2. 數字(Numeric)數據類型
數字類型用于存儲整數或小數,主要分為整數類型和浮點/定點類型。
2.1 整數類型
數據類型 | 存儲大小 | 取值范圍(無符號) | 適用場景 |
---|---|---|---|
TINYINT | 1 字節 | 0 ~ 255 | 布爾值(0/1)、評分 |
SMALLINT | 2 字節 | 0 ~ 65,535 | 小范圍數值,如年齡 |
MEDIUMINT | 3 字節 | 0 ~ 16,777,215 | 適用于 ID、自增字段 |
INT(INTEGER) | 4 字節 | 0 ~ 4,294,967,295 | 適用于大部分場景,如用戶 ID |
BIGINT | 8 字節 | 0 ~ 18,446,744,073,709,551,615 | 適用于超大數值,如銀行賬戶余額 |
無符號(UNSIGNED) vs. 有符號
- 默認情況下整數是有符號的(即支持負數)。
UNSIGNED
關鍵字可以使整數僅存儲非負數,從而擴大可用范圍。CREATE TABLE users (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY );
2.2 浮點與定點類型
數據類型 | 存儲大小 | 適用場景 |
---|---|---|
FLOAT(M, D) | 4 字節 | 適用于非嚴格精度的計算,如游戲評分 |
DOUBLE(M, D) | 8 字節 | 高精度計算,如科學計算 |
DECIMAL(M, D)(NUMERIC) | 可變 | 財務計算,避免精度丟失 |
FLOAT vs. DECIMAL
- FLOAT/DOUBLE 使用二進制存儲,可能導致精度誤差:
SELECT 0.1 + 0.2; -- 結果可能不是 0.3
- DECIMAL 采用字符串存儲,不會丟失精度:
CREATE TABLE transactions (amount DECIMAL(10,2) NOT NULL );
建議:
- 財務類數據使用
DECIMAL
,避免計算誤差。 - 非關鍵計算(如統計數據)可使用
FLOAT
或DOUBLE
。
3. 日期與時間(Date & Time)
MySQL 提供多個日期時間類型:
數據類型 | 存儲大小 | 取值范圍 | 適用場景 |
---|---|---|---|
DATE | 3 字節 | 1000-01-01 ~ 9999-12-31 | 生日、訂單日期 |
DATETIME | 8 字節 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 需要精確到秒的時間,如創建時間 |
TIMESTAMP | 4 字節 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 適用于存儲 Unix 時間戳 |
TIME | 3 字節 | -838:59:59 ~ 838:59:59 | 記錄時間間隔 |
YEAR | 1 字節 | 1901 ~ 2155 | 適用于年份數據 |
DATETIME vs. TIMESTAMP
- TIMESTAMP 受時區影響,適合存儲事件發生時間。
- DATETIME 不受時區影響,適合存儲固定時間。
CREATE TABLE events (event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4. 選擇數據類型的最佳實踐
- 能用整數就不要用字符串(如性別可用
TINYINT
)。 - 存儲金額、財務數據時,使用
DECIMAL
而非FLOAT
。 - 短文本(<255 字符)用
VARCHAR
,長文本用TEXT
。 - 索引字段盡量避免
TEXT
和BLOB
,影響查詢性能。 - 時間戳數據盡量使用
TIMESTAMP
代替DATETIME
,節省存儲空間。
總結
MySQL 提供了多種數據類型,每種類型都有其適用場景。合理選擇數據類型可以提升存儲效率、優化查詢性能,并避免精度損失。希望這篇文章能幫助你在數據庫設計時做出更好的選擇!🚀