MySQL知識點
一:MySQL概述
MySQL是一款開源的數據庫軟件,是一種關系型數據庫管理系統(ROBMS),也叫做表數據庫管理系統
如果需要快速安全地處理大量的數據,則必須使用數據庫管理系統;任何基于數據庫編程的程序,其本質都是對數據的處理操作;通過使用數據庫,數據便可以被動態地展示;只有與數據庫相結合,才能充分地發揮動態網頁編程語言的魅力
(1)數據庫(DB)
存放數據的倉庫
(2)數據庫管理系統(DBMS)
是一個操作和管理數據庫的系統軟件,主要負責存儲和管理網站所需的內容數據,用于建立;使用和維護數據庫
(3)數據庫系統(DBS)
由數據庫;數據庫管理系統;應用系統和用戶共同組成
二:MySQL服務器的啟動和退出
每一行命令結束后,記得按回車鍵(Enter)
1.MySQL服務器的啟動與關閉
(1)啟動MySQL服務器
首先,以管理員的身份運行命令提示符,輸入命令來啟動mysql
服務器:
net start mysql版本號
net start mysql版本號
是Windows系統命令,需要管理員權限運行,用于啟動在Windows服務中注冊的MySQL服務進程,使MySQL服務進程(mysqld.exe
)開始運行
在MySQL服務未運行時,使用該命令啟動服務之后才能通過客戶端連接服務器(僅啟動服務,不涉及用戶登錄和數據庫操作)
(2)關閉MySQL服務器
以下兩種命令都可以關閉MySQL數據庫服務器
net stop mysql版本號
net stop mysql版本號
是Windows系統命令,非MySQL自身命令,需要管理員權限運行,用于停止在Windows服務中注冊的名為 “mysql版本號
” 的MySQL服務進程(命令中的服務名需與實際安裝名稱一致)
SHUTDOWN
SHUTDOWN
是通用方法,需在命令行中執行,而不是MySQL客戶端內,要管理員權限
2.MySQL服務器的連接與退出
(1)連接MySQL服務器
首先,打開命令行窗口,輸入命令:
用于連接數據庫服務器,進入MySQL:
mysql -h 服務器名稱/IP地址 -u 用戶名 -p用戶密碼
- -h:指定的是所連接的數據庫服務器地址,如果連接的是本機,該參數可以省略
- -u:指定連接數據庫服務器使用的用戶名(如:root表示管理員身份)
- -p:指定連接數據庫服務器使用的密碼,-p和其后的參數值之間不允許有空格;也可以省略-p后面的參數值,按回車鍵(Enter)后以密文的形式輸入密碼
所以可以簡寫為:
mysql -u 用戶名 -p密碼
mysql -u 用戶名 -p密碼
是MySQL客戶端命令,用于指定用戶(如:root)身份登錄到已經運行的MySQL服務器(僅用于客戶端連接,而非啟動MySQL服務,需要MySQL服務已經處于運行狀態時使用)
在MySQL服務啟動后,通過此命令連接到服務器,進入MySQL命令行界面進行數據庫操作
(2)退出MySQL服務器
以下兩種命令都可以退出MySQL數據庫服務器
exit
quit
exit
和 quit
是MySQL客戶端命令,用于退出MySQL命令行交互界面(MySQL控制臺)
exit
和 quit
的功能完全相同,只是別名關系,均用于退出MySQL客戶端,不會影響MySQL服務器;執行后僅關閉當前客戶端會話,服務器進程(如:mysqld.exe
)仍在運行
3.對于啟動與連接;關閉與退出的區分
(1)啟動與連接
net start mysql版本號 | mysql -u 用戶名 -p密碼 | |
---|---|---|
作用: | 啟動MySQL Windows服務 | 指定用戶身份登錄MySQL服務器 |
使用場景: | MySQL服務未運行時啟動服務 | MySQL服務已運行時連接服務器 |
用戶登錄: | 不涉及用戶登錄 | 涉及用戶登錄 |
net start mysql版本號
:僅啟動服務,無法直接進行數據庫操作,此命令需要管理員權限
mysql -u 用戶名 -p密碼
:僅用于登錄,無法啟動服務,需要具有相應權限的MySQL用戶
(2)關閉與退出
net stop mysql版本號 | SHUTDOWN | exit 和 quit | |
---|---|---|---|
作用: | 關閉MySQL Windows服務 | 關閉MySQL服務 | 用于退出客戶端會話 |
使用位置: | 在Windows命令行中使用 | 在MySQL命令行中使用 | 在MySQL客戶端內使用 |
是否影響服務器: | 影響服務器 | 影響服務器 | 不影響服務器 |
4.一些名詞解釋及問題
(1)MySQL命令行
通過操作系統的終端(命令提示符)直接訪問MySQL服務器的一種方式
MySQL命令行是基于命令行界面的工具,用戶通過輸入特定的MySQL命令來與MySQL服務器進行交互
啟動方式:
打開終端(命令提示符)輸入 mysql -u 用戶名 -p密碼
,回車(Enter)后即可進入MySQL命令行
(2)MySQL客戶端
MySQL客戶端包括所以可以與MySQL服務器進行通信的應用程序,既包含命令行工具(前面提到的MySQL命令行),也包含圖形化界面工具
MySQL命令行是MySQL客戶端的一種具體實現形式
(3)Windows命令行
Windows命令行是Windows操作系統提供的一個基于命令行的用戶界面,允許用戶通過輸入命令來執行各種系統操作和程序,并不直接與MySQL服務器交互
雖然Windows命令行并不能直接執行MySQL的SQL命令,但可以通過它來啟動MySQL服務,使其連接到MySQL命令行等
啟動方式:
按下 “Win+R” 鍵打開 “運行對話框” ,輸入 “cmd
” 并回車(Enter),即可打開Windows命令提示符窗口
(4)為什么需要先啟動服務(MySQL服務的作用)
- 后臺進程:MySQL服務(mysqld.exe或mysqld)是一個后臺運行的守護進程,該進程負責監聽客戶端的連接請求(默認端口號3306);管理數據庫文件(如:數據表;索引等);執行SQL操作等
- 服務化設計:
- 自動管理: 開機自動啟動,避免手動操作
- 隔離性: 服務在后臺運行,用戶無需關心進程細節
- 資源控制: 服務管理器可限制資源占用
如果服務未運行,MySQL客戶端將無法連接到MySQL服務器,數據庫文件也將無法被訪問,客戶端登錄的前提條件是MySQL服務已啟動
何時需要手動啟動服務:
- 首次安裝后: MySQL服務默認為未啟動,所以需要手動啟動
- 服務崩潰或者是異常停止: 當系統重啟后服務未自動恢復時
- 開發調試時: 臨時重啟服務后
(5)為什么mysql -u 用戶名 -p密碼
可以直接登錄而無需手動啟動服務
- 如果MySQL服務被設置為自動啟動,則在系統啟動時會自動執行,無需手動干預
- 一旦通過
net start mysql版本號
啟動服務,則服務會持續運行,直到顯示停止(如通過net stop mysql版本號
來關閉服務或系統重啟)在后續客戶端登錄時,服務已經處于運行狀態則無需再次啟動
mysql -u 用戶名 -p密碼
是客戶端命令,執行流程如下:
- 檢查服務狀態: 客戶端嘗試連接MySQL的默認端口號(3306)
- 若服務未運行: 連接失敗
- 若服務已運行: 客戶端會發送認證請求(用戶名和密碼)服務端驗證權限后建立會話
注意:
用戶很可能因為服務自動啟動從而忽略這一過程
操作 | 作用對象 | 執行環境 | 服務狀態 | 作用場景 |
---|---|---|---|---|
net start mysql版本號 | MySQL服務進程 | Windows命令行 | 啟動服務 | 首次安裝或服務崩潰后恢復 |
mysql -u 用戶名 -p密碼 | MySQL客戶端會話 | MySQL命令行客戶端 | 依賴服務已運行 | 日常數據庫操作或開發調試 |
(6)為什么MySQL要設計為”服務化“
MySQL作為服務運行,提供了穩定性;可管理性;安全性和并發性,是數據庫系統的標準架構,理解這一機制有助于更高效地排查連接問題
- 穩定性: 服務進程與用戶會話分離,避免了因用戶退出導致數據庫崩潰
- 可管理性: 通過服務管理器(如systemd)可監控進程狀態,限制資源占用
- 安全性: 服務可配置為以非特權用戶運行(如mysql用戶),降低系統風險
- 并發性: 服務可同時處理多個客戶端連接,支持高并發訪問
(7)設置MySQL服務為自動啟動
按下 “Win+R
” 鍵,打開 “運行” 對話框,在文本框中輸入 services.msc
,按下回車,此時打開服務管理器,找到MySQL服務,右鍵點擊選擇 “屬性” ,最后將啟動類型改為自動
(8)如何確認服務是否運行
sc query mysql版本號
(9)若客戶端登錄失敗,但服務已啟動
netstat -ano | findstr 3306
使用此命令可以幫助檢查以下問題
-
端口監聽狀態:
正常情況會顯示
LISTENING
狀態,表明 MySQL 正在 3306 端口監聽連接若未顯示任何結果,說明服務未正確綁定 3306 端口(可能配置了其他端口或服務啟動異常)
-
監聽地址:
顯示
0.0.0.0:3306
表示允許所有 IP 連接顯示
127.0.0.1:3306
表示僅允許本地連接(遠程客戶端無法訪問) -
防火墻排查:
若端口處于監聽狀態但仍無法連接,需檢查防火墻是否放行 3306 端口
(10)用net stop mysql版本號
關閉服務的原因及作用
net stop mysql版本號
是Windows系統命令,用于停止以服務形式運行運行的MySQL后臺進程(mysqid.exe)- 關閉服務會釋放系統資源(內存;端口號等)并確保數據庫處于安全狀態,避免數據損壞或丟失
使用場景:
- 系統維護: 在進行系統升級,配置修改或硬件維護時,需先停止MySQL服務
- 故障排查: 當MySQL服務出現異常時,可通過關閉服務重啟來解決問題
- 資源釋放: 長時間運行的MySQL服務可能占用較多的系統資源,關閉后可釋放資源供其他程序使用
(11)exit
命令的作用及與關閉服務的區別
exit
是MySQL客戶端命令,用于退出當前與MySQL服務器的交互會話,以釋放客戶端占用的資源- 執行
exit
后,用戶會返回操作系統命令行界面,但MySQL服務進程仍會運行,其他客戶端仍可連接
exit
與直接關閉服務的區別:
- 操作對象不同:
net stop mysql版本號
作用于MySQL服務進程
exit
作用于MySQL客戶端會話
- 影響范圍不同:
net stop mysql版本號
用于停止整個MySQL服務,所有客戶端的連接都會中斷
exit
僅用于終止當前客戶端會話,不影響其他客戶端和服務本身
- 使用場景不同:
net stop mysql版本號
在需要完全停止MySQL服務時使用
exit
在完成數據庫操作后退出客戶端時使用
5.sc命令于net命令的區別
(1)啟動服務
sc start mysql版本號
(2)停止服務
sc stop mysql版本號
(3)重啟服務
sc restart mysql版本號
(4)獲取服務狀態
sc query mysql版本號
sc
命令和net
命令均用于管理服務,二者具體區別如下:
- 命令來源與底層機制:
sc
命令是Windows系統中用于與服務控制管理器(scm
)交互的命令行工具,屬于系統原生工具,它直接調用服務控制端口,底層操作更貼近系統服務管理機制,適合需要精確控制服務參數的場景net
命令是Windows系統中用于管理網絡資源及服務的傳統工具,通過封裝系統API來實現服務啟動,兼容性更好,適合常規服務管理操作
- 功能差異:
sc
命令支持傳遞附加參數(如:依賴服務;啟動超時設置等),它提供了更詳細的服務狀態反饋(如:錯誤代碼;進程ID等)便于診斷問題net
命令的功能相對簡單,不提供參數化配置能力,輸出信息更簡潔,適合快速操作
- 使用場景推薦:
sc
命令適合開發調試或故障排查時使用net
命令適合日常快速啟動服務及需要兼容舊版Windows系統時使用
- 核心區別
sc
命令更底層;功能更豐富,適合高級管理net
命令更簡單直接,適合日常操作
三:操作MySQL數據庫
- 每個數據庫都有唯一的數據庫文件名作為與其他數據庫區別的標識
- MySQL數據庫分為系統數據庫(DBMS)和自建數據庫兩種類型
- 安裝MySQL后,系統自動創建的數據庫稱為系統數據庫
系統數據庫有:
mysql
;information_schema
;performance_schema
;sys
其中,MySQL數據庫服務器把有關數據庫的信息存儲在mysql
和information_schema
這兩個數據庫中,如果刪除了這兩個數據庫,MySQL數據庫服務器將無法正常工作
關系數據庫中的名詞術語:
- 列: 也叫字段;屬性;數據項
- 行: 也叫元組;記錄
- 表: 也叫關系
- 表內容: 也叫值
- 表標題: 也叫格式
- 候選碼: 唯一識別元組
- 主鍵: 當有多個候選碼時選一個作為主鍵
其中,表是最基本的數據對象,用于存放數據庫的數據,一個數據庫中包含多個數據表;候選碼具有唯一性且可以有多個;主鍵只能有1個(1個指的是一列或由多列組成的復合列)
1.對MySQL數據庫的操作
(1)創建數據庫
CREATE DATABASE 數據庫名;
SQL語句在Windows和MacOS的環境中不區分字符的大小寫,但在Linux環境中嚴格區分大小寫
數據庫的命名規則:
- 不能與其他數據庫重名
- 名稱可以使用字母;阿拉伯數字;下劃線(_)或$中的任意字符開頭,但要避免使用單獨的數字
- 禁止使用MySQL關鍵字作為數據庫及數據表名
- 建議使用小寫字母來定義數據庫及數據表名
- 名稱最長可為64個字符(包括表;列和索引的命名),而別名最多可達256個字符
注意:
- 所有的SQL語句命令的最后都以英文分號 “
;
” 結尾 - 數據庫名;表名;列名最好不要使用中文命名
(2)查看當前數據庫
SHOW DATABASES;
用于顯示當前本地MySQL數據庫服務器下的所有已經存在的數據庫名
(3)選擇數據庫
USE 數據庫名;
用于指定一個數據庫,使其成為當前使用的數據庫
(4)刪除數據庫
DROP DATABASE 數據庫名;
用于刪除指定的數據庫,一旦執行,數據庫中的所有結構和數據都會被刪除,沒有恢復的可能,除非有備份
(5)數據表概述
- 創建數據庫以后,需要在其中創建數據表來存儲數據,一個數據庫中可以包含一張或多張表,表是數據的集合,是用來存儲數據和操作數據的
- 數據在數據表中是按照行和列的格式來排列的
四:MySQL數據類型
數據類型可以更加方便管理和使用數據,它決定了存儲數據的存儲格式和有效范圍
在MySQL數據庫中,每一條數據都有其數據類型
MySQL的數據類型主要分為三大類:
1.數值類型(數值類型的字節數是固定的)
(1)整數數據類型
數據類型 | 取值范圍 | 描述 | 所占字節數 |
---|---|---|---|
TINYINT | 有符號值:-128~127; 無符號值:0~255 | 最小的整數 | 1字節 |
SMALLINT | 有符號值:-32768~32767; 無符號值:0~65535 | 微小型整數 | 2字節 |
MEDIUMINT | 有符號值:-8388608~8388607; 無符號值:0~16777215 | 小型整數 | 3字節 |
INT(INTEGER) | 有符號值:-2147483648~2147483647; 無符號值:0~4294967295 | 中型整數 | 4字節 |
BIGINT | 有符號值:-9223372036854775808~9223372036854775807; 無符號值:0~18446744073709551615 | 大型整數 | 8字節 |
注意:
- 在整數類型后面加上
UNSIGNED
屬性,表示聲明的是無符號值,其取值從0開始 - 在整數類型后面加上
ZEROFILL
屬性,表示在數值之前自動用0補充不足的位數;當使用ZEROFILL
屬性修飾時,自動應用UNSIGNED
屬性 - 在聲明整數類型時,可以為它指定一個顯示寬度(1~255),如果沒有給它指定顯示寬度,MySQL會給它指定一個默認值顯示寬度,僅用于顯示,并不會限制取值范圍(如:
INT(5)
) - 數值類型的字節數是固定的,它的取值范圍由其占用的字節數和編碼方式(有符號/無符號)共同決定,字節數越多,數值取值范圍越大
(2)浮點數數據類型
數據類型 | 取值范圍 | 描述 | 精度 | 所占字節數 |
---|---|---|---|---|
FLOAT | 最小正規范數: 即 1.175494 × 10?3? 最大正規范數: 即 3.402823 × 103? 最小正非規范數: 用于接近零的值 負數范圍: 對稱取反 | 單精度浮點數 | 約 6~7 位有效數字 | 4字節 |
DOUBLE | 最小正規范數: 即 2.225074 × 10?3?? 最大正規范數: 即 1.797693 × 103?? 最小正非規范數: 用于接近零的值 負數范圍: 對稱取反 | 雙精度浮點數 | 約 15~17 位有效數字 | 8字節 |
DEC(DECIMAL) | DECIMAL(M, N) 的取值范圍由精度(即總位數) M 和小數位數(即小數點后的位數) N 決定 | 自定義精確數型 | 精確到定義的小數位 | 因精度位數而異 |
注意:
- 未指定精度時,默認
DECIMAL(10, 0)
DECIMAL
的存儲空間由精度M
決定,每 9 位數字需要 4 字節,以此類推(每增加 9 位,增加 4 字節)- 在聲明浮點數類型時,可以為它指定一個顯示寬度指示器和一個小數點指示器(如:
FLOAT(5, 2)
5表示顯示的值不超過5位數字;2表示小數點后有2位數字),存入的數據會自動被四舍五入 - 高精度會顯著增加存儲空間和計算開銷,需根據業務需求選擇: FLOAT:適合對內存敏感的場景(如大規模科學計算),但精度較低 DOUBLE:默認推薦類型,平衡了范圍和精度,適合大多數工程計算 DECIMAL:需要精確小數時使用(如貨幣)
2.字符串類型
字符串類型可以用來存儲任何一個值,MySQL中的字符串可以被單引號或雙引號包裹
字符串類型分為三類:
(1)普通的文本字符串類型
數據類型 | 取值范圍 | 描述 | 所占字節數 |
---|---|---|---|
CHAR(M) | 0~M個字符(M<=255) | 定長字符串,存儲空間固定,適合存儲長度相近的數據 | M x 3(在UTF-8中,1個中文字符占3個字節) |
VARCHAR(M) | 0~M個字符(M<=65535) | 變長字符串,長度可變,其它和char(M) 類似 | M x 3 + 長度標識(1/2字節) |
注意:
CHAR(M)
無論實際存儲的字符數是否達到M
,均占用Mx字符集字節數
的空間VARCHAR(M)
僅占用實際的字符長度+長度標識
的空間- 在使用
CHAR
類型時,當實際傳入的值的長度小于指定長度,會使用空格將實際長度填補至指定長度;而在使用VARCHAR
類型時,當實際傳入的值的長度小于指定長度,那么實際長度即為傳入字符串的長度,不會使用空格填補 - 在使用
CHAR
和VARCHAR
類型時,當實際傳入的值的長度大于指定長度,字符串會被截取至指定長度 CHAR(M)
和VARCHAR(M)
表示可以存儲M
個字符,注意不是M
個字節- 當數據分布不均時,使用
VARCHAR(M)
可大幅節省存儲空間,變長類型的長度標識允許數據庫動態計算實際占用空間并進行分配,可避免因固定長度導致數據溢出和存儲空間的浪費 - 字符集對
CHAR
類型沒有影響,因此CHAR(M)
中的M
最大為255;但是字符集對VARCHAR
類型是有影響的,如果使用的是UTF-8
字符集,每個字符大小為3字節,最大支持21845(65535/3=21845)個字符,因此VARCHAR(M)
中的M
最大為21845
(2)可變類型
數據類型 | 取值范圍 | 描述 | 說明 |
---|---|---|---|
TINYBLOB | 0~255 字節(二進制數據) | 小BLOB 字段 | 存儲短二進制數據(如:小型圖標、加密密鑰等) |
TINYTEXT | 0~255 字節(文本數據,字符數取決于編碼) | 小文本串 | 存儲短文本(如:簡短描述、標簽等)UTF-8 編碼下字符數可能少于 255 |
BLOB | 0~65,535 字節(約 64KB) | 常規BLOB 字段 | 存儲中等二進制數據(如:小圖片、音頻片段等) |
TEXT | 0~65,535 字節(約 64KB,字符數取決于編碼) | 常規文本串 | 存儲中等長度文本(如:文章摘要、評論等)UTF-8 編碼下字符數可能少于 65,535 |
MEDIUMBLOB | 0~16,777,215 字節(約 16MB) | 中等BLOB 字段 | 存儲較大二進制數據(如:高清圖片、短視頻片段等) |
MEDIUMTEXT | 0~16,777,215 字節(約 16MB,字符數取決于編碼) | 中等文本串 | 存儲較長文本(如:長文章、日志等)UTF-8 編碼下字符數可能少于 16,777,215 |
LONGBLOB | 0~4,294,967,295 字節(約 4GB) | 長BLOB字段 | 存儲大型二進制數據(如:完整視頻、大型文件等) |
LONGTEXT | 0~4,294,967,295 字節(約 4GB,字符數取決于編碼) | 長文本串 | 存儲超長文本(如:書籍內容、詳細報告等)UTF-8 編碼下字符數可能少于 4,294,967,295 |
注意:
1. 關于二進制和文本類型:
- BLOB 系列(
TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
)用于存儲二進制數據,支持任何數據(如圖片、音頻、視頻等),字符集編碼對BLOB
系列類型沒有影響 - TEXT 系列(
TINYTEXT
、TEXT
、MEDIUMTEXT
、LONGTEXT
)用于存儲文本數據(如文章、評論、日志等),TEXT系列類型實際字符數的取值范圍受字符集編碼影響
2. 性能與存儲建議:
- 小數據:優先使用
TINYBLOB
/TINYTEXT
或BLOB
/TEXT
,以節省存儲空間 - 大數據:對于超過 16MB 的數據(如高清視頻),考慮使用
LONGBLOB
/LONGTEXT
,但需要注意數據庫性能影響 - 替代方案:對于超大型文件(如 GB 級視頻),建議存儲文件路徑而非文件本身,以避免數據庫膨脹
(3)特殊類型
數據類型 | 最大值 | 描述 | 說明 | 所占字節數 |
---|---|---|---|---|
Enum("value1", "value2", ...) | 65535 | 從預定義的列表中選擇單個值 | 適用于單選字段(如:訂單狀態;性別等) | 1~2 |
Set("value1", "value2", ...) | 64 | 從預定義的列表中選擇0個或多個值 | 適用于多選字段(如:用戶權限;興趣等) | 1~8 |
3.日期/時間類型
數據類型 | 取值范圍 | 說明 | 所占字節數 |
---|---|---|---|
DATE | 1000-01-01 ~ 9999-12-31 | 日期,格式為:YYYY-MM-DD | 3 |
TIME | -838:59:59 ~ 838:59:59 | 時間,格式為:HH:MM:SS | 3 |
DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 日期和時間,格式為:YYYY-MM-DD HH:MM:SS | 8 |
TIMESTAMP | '1970-01-01' 00:00:00 ~ 2037年的某個時間 | 時間戳,格式為:YYYY-MM-DD HH:MM:SS | 4 |
YEAR | 1901 ~ 2155 | 年份,格式為:YYYY | 1 |
4.關于字符、字節和字符集
-
在不同的字符集下,字符占用的字節數不同;字符數也不同
-
字符;字節和字符集是計算機科學和信息技術中與文本處理密切相關的核心概念
(1)字符
-
字符是人類可識別的最小文本單元,也是與用戶直接交互的文本單位(字母;數字;符號;漢字等都是字符)
-
字符具有抽象性,是邏輯概念,不直接對應計算機的存儲方式,需通過字符集映射到二進制編碼
(2)字節
-
字節(Byte)是計算機存儲和傳輸數據的基本單位,也是計算機處理數據的物理單位,所有數據(包括字符)最終都以字節的形式存儲在計算機中
-
1字節=8位二進制數(bit)
(3)字符集
-
字符集是字符與二進制編碼(字節)之間的映射(翻譯)規則,用于編碼(將字符轉換為字節序列)和解碼(將字節序列還原為字符)
-
字符集是連接字符與字節的橋梁,決定了字符所占用的字節數和字符的存儲效率
-
通過合理的選擇字符集和優化編碼方式可避免存儲空間的浪費和亂碼問題
-
編碼格式是字符集的具體實現;字符集是眾多字符的集合
5.數據類型的選擇
(1)固定長度數據用 CHAR(速度快但可能浪費空間)
- 適用場景: 數據長度完全固定時(如身份證號、手機號、固定5位的郵編等)
- 優點: 存儲和查詢速度快,因為計算機直接通過固定位置讀取,無需計算長度
- 缺點: 如果數據長度不足(如只存"M"),會用空格填充到指定長度,浪費存儲空間
(2)可變長度數據用 VARCHAR(省空間但稍慢)
- 適用場景: 數據長度不固定時(如用戶名、地址、電話號碼)
- 優點: 只占用實際數據長度 + 1~2字節長度標識,不會浪費
- 缺點: 需要額外計算長度,查詢速度略慢于
CHAR
(3)限定選項用 ENUM(只能選一個預設值)
- 適用場景: 數據必須從預設的固定選項中選擇時(如訂單狀態:待支付、已支付、已取消;用戶類型等)
- 優點: 強制數據規范(避免拼寫錯誤或無效值);存儲效率高(內部用整數索引存儲)
- 缺點: 修改選項時需要改表結構
(4)多選項組合用 SET(可選多個預設值)
- 適用場景: 數據可以從多個預設選項中選一個或多個時(如用戶興趣:運動、音樂、閱讀;商品標簽)
- 優點: 能存儲多個選項的組合(如"運動,音樂")
- 缺點: 選項數量有限(最多64個);修改選項同樣需要改表結構
(5)不區分大小寫搜索用 TEXT(適合長文本)
- 適用場景: 存儲長文本(如文章內容、評論)且搜索時不區分大小寫(如搜"hello"能匹配"Hello")
- 注意:
TEXT
類型本身默認不區分大小寫,實際行為取決于數據庫的排序規則
(6)區分大小寫搜索用 BLOB(或二進制類型)
- 適用場景: 需要精確匹配大小寫(如密碼哈希、文件指紋)或存儲二進制數據(如圖片、音頻)
- 優點: 嚴格區分大小寫,適合需要精確匹配的場景
注意:
- 性能與空間的權衡:
CHAR
快但可能浪費空間,VARCHAR
省空間但稍慢 - ENUM/SET 的限制: 預設選項修改較麻煩(需改表結構),適合固定不變的選項
- TEXT/BLOB 的區別:
TEXT
用于文本,BLOB
用于二進制數據;搜索行為取決于數據庫配置(如排序規則)
通過合理選擇數據類型,既能保證數據準確性,又能提升存儲效率和查詢性能!