MySQL有哪些數(shù)據(jù)類型?MySQL 數(shù)據(jù)類型是數(shù)據(jù)庫設(shè)計(jì)中非常基礎(chǔ)和重要的概念,選擇合適的數(shù)據(jù)類型對于優(yōu)化存儲空間、提升查詢性能和數(shù)據(jù)準(zhǔn)確性都至關(guān)重要。
MySQL 數(shù)據(jù)類型主要分為三大類:數(shù)值類型、字符串(文本)類型、日期/時(shí)間類型。此外,還有兩種現(xiàn)代且常用的特殊類型。
數(shù)值類型用于存儲數(shù)字,分為整數(shù)類型和浮點(diǎn)數(shù)(小數(shù))類型。
-
整數(shù)類型 整數(shù)類型可選 UNSIGNED 屬性,表示無符號(僅非負(fù)數(shù)),這樣可以使正數(shù)的范圍擴(kuò)大一倍。
最佳實(shí)踐:選擇類型時(shí),在滿足需求的前提下盡可能使用最小的數(shù)據(jù)類型。例如,age 字段用 TINYINT UNSIGNED 就足夠了。
-
浮點(diǎn)數(shù)類型 (近似值) 用于存儲近似值的小數(shù),計(jì)算時(shí)可能會有精度損失。
-
定點(diǎn)數(shù)類型 (精確值) 用于存儲精確的小數(shù)值,如財(cái)務(wù)數(shù)據(jù)、貨幣計(jì)算。
FLOAT/DOUBLE vs DECIMAL:追求性能(計(jì)算速度)用 FLOAT/DOUBLE,追求精確性(無舍入誤差)用 DECIMAL。
字符串類型用于存儲文本、二進(jìn)制數(shù)據(jù)(如圖片、文件)等。
-
短文本與二進(jìn)制字符串
CHAR vs VARCHAR:長度固定用 CHAR,長度變化大用 VARCHAR。
-
長文本與二進(jìn)制字符串 (BLOB & TEXT) 這些類型用于存儲大型數(shù)據(jù)。BLOB 系列存儲二進(jìn)制數(shù)據(jù),TEXT 系列存儲字符文本數(shù)據(jù)。
注意:通常不建議將大型文件直接存入數(shù)據(jù)庫,而是將文件存儲在文件系統(tǒng)或?qū)ο蟠鎯Γㄈ鏏WS S3)中,然后在數(shù)據(jù)庫中只保存文件的路徑或URL。
DATETIME vs TIMESTAMP: 需要范圍更大、與時(shí)區(qū)無關(guān),用 DATETIME。 需要自動記錄行更新時(shí)間、節(jié)省空間、與時(shí)區(qū)相關(guān),用 TIMESTAMP。常定義為 UPDATE CURRENT_TIMESTAMP。
-
JSON 類型 (MySQL 5.7.8+) 用于存儲 JSON 格式的數(shù)據(jù),MySQL 提供了自動驗(yàn)證 JSON 格式和一系列便捷的 JSON 查詢函數(shù)。
CREATE TABLE user ( id INT, profile JSON -- 存儲用戶的JSON配置信息 ); INSERT INTO user VALUES (1, '{"name": "John", "hobbies": ["reading", "coding"]}');
-
空間數(shù)據(jù)類型 (GIS) 用于存儲地理信息數(shù)據(jù),如點(diǎn)、線、多邊形等。例如 GEOMETRY, POINT, POLYGON。
-
更小通常更好:在滿足需求的前提下,選擇占用空間最小的數(shù)據(jù)類型。它們通常更快,占用更少的磁盤和內(nèi)存。
-
簡單就好:整型比字符操作更簡單。例如,用 INT 存儲 IP 地址不如用MySQL提供的 INET_ATON() 和 INET_NTOA() 函數(shù)將其轉(zhuǎn)換為無符號整型存儲。
-
避免使用 NULL:盡量定義字段為 NOT NULL。除非必要,因?yàn)榭蔀?NULL 的列使索引和值處理更復(fù)雜,且占用更多空間。
-
字符集選擇:對于中文等非拉丁字符,通常使用 utf8mb4 字符集(真正完整的UTF-8支持,utf8 在MySQL中并非完整的UTF-8)。
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 無符號自增主鍵 `username` VARCHAR(50) NOT NULL UNIQUE, -- 變長用戶名 `age` TINYINT UNSIGNED NULL, -- 小范圍無符號年齡 `balance` DECIMAL(10, 2) NOT NULL DEFAULT '0.00', -- 精確的賬戶余額 `avatar_url` VARCHAR(255) NULL, -- 存儲頭像鏈接,而非圖片本身 `status` ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active', -- 枚舉狀態(tài) `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 自動記錄創(chuàng)建時(shí)間 `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自動更新 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
另外搭配便捷的MYSQL備份工具,可定時(shí)備份、異地備份,MYSQL導(dǎo)出導(dǎo)入?杀镜剡B接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。