本位基於MySQL5.7.24。CHAR和VARCHAR都可以用來表示字符類型,其不同在於兩者的存儲與檢索、最大長度和尾部空格串的處理等方面。
1 基礎總結
下表是CHAR和CARCHAR的知識總結:
char與varchar的基礎總結
以下幾點需要特別引起注意:
1> 雖然在聲明時,兩種類型的m都可以指定為0,實際上最長長度為0隻能存放空字符串。
2> 關於長度範圍,CHAR在聲明時,m只能是0~255之間的數字;VARCHAR在聲明時,m只能是0~4294967295範圍的數字。
2 存儲
CHAR是定長字符串類型,在聲明時指定其長度m,在進行數據寫入時,如果寫入的字符串未達到指定長度m,那麼會在左側使用空格補齊到長度m,所以,聲明為m長度的CHAR類型,不論其存放的字符串長短,統一都會佔用m字節。
VARCHAR是變長字符串類型,在聲明時雖然指定其長度m,僅指其能存放字符串的最長長度,在存儲時,如果存放的字符串長度不超過255,VARCHAR會額外申請一個字節用於存放實際字符串的長度,如果超過255,會額外申請兩個字節的空間用於存放實際字符串的長度,所以根據VARCHAR實際存放的字符長度不同,其所佔空間也會不同。例如在CHAR(4)和VARCHAR(4)中存放不同數據類型,其結果如下表所示:
char與varchar的存儲
上表中最後一行,展示了當存儲字符串超出其聲明的最大長度時的提現,如果sql_mode未使用嚴格模式,則會如上表所示的樣子,按最大長度截取,但是會產生警告;如果設置了嚴格模式,則會報錯,如下圖所示:
超長字符串的裁剪
Char類型的數據在存儲時會自動裁剪右側的空格串,而VARCHAR則不會,如下圖所示:
右側空格串的裁剪
為了使結果更明顯,上圖中使用concat對輸出結果進行了調整,可以看到CHAR在存儲時,自動裁剪了右側的空格串。
3 數據的校驗
CHAR、VARCHAR(以及TEXT)類型在進行比較時,會自動裁剪後側的空格串,然後進行比較,如下圖所示:
字符串的校驗1
對於此規則,如果在該類型的列上有唯一索引,那麼插入裁剪右側空格串後相同的字符串會報錯。
如果需要將右側的空格字符串參與比較,使用like即可,如下圖所示:
字符串的比較校驗2
4 總結
本文總結梳理了MySQL資料庫char與varchar類型的知識並給出了相應樣例,在實際應用中如何選擇合適的數據類型是非常重要的,其最重要的區別在於定長與變長,一般來說,能適用於char的地方varchar一定可以使用。
如提前知道需要存放的數據內容,如郵政編碼、彩票號碼等固定位數的字符串,則可以使用char類型,如不能確定長度的情況下,應該使用varchar。
在使用中藥注意超過最大長度和不到最大長度時兩種類型的不同處理。
對於字符串比較時的右側空格串裁剪規則要引起注意,不同字符串因比較結果相同可能會引發不明顯的錯誤結果。