mysql中char和varchar的區別與聯系


char和varchar都是mysql中用來存儲字符型數據的,而他們又有些不同。

一、varchar類型

一般初學者會認為,二者占用的空間是一樣的。比如說我存儲5個char,二者確實實際占用了5個char。但是仔細思考一下,如果二者真的一樣的話,那么在設計數據庫的時候有必要弄兩個類型嗎?顯然他們是不同的。

varchar類型需要在數據之前利用一個或者兩個字節來存儲數據的長度,並且二者在內存中的操作方式也是不同的。

如存儲一個用戶的地址信息。根據評估,只要使用100個字符即可。但是有些數據庫管理員會認為,反正Varchar數據類型是根據實際的需要來分配長度的,還不如給其大一點呢。為此他們可能會為這個字段一次性分配200個字符的存儲空間。

那VARCHAR(100)與VARCHAR(200)真的相同嗎?結果是否定的。

雖然他們用來存儲90個字符的數據,其存儲空間相同。但是對於內存的消耗是不同的。對於VARCHAR數據類型來說,硬盤上的存儲空間雖然都是根據實際字符長度來分配存儲空間的,但是對於內存來說,則不是。實際是使用固定大小的內存塊來保存值的。簡單的說,就是使用字符類型中定義的長度,即200個字符空間。顯然,這對於排序或者臨時表(這些內容都需要通過內存來實現)作業會產生比較大的不利影響。

原因如下:假設VARCHAR(100)與VARCHAR(200)類型,實際存90個字符,它不會對存儲端產生影響(就是實際占用硬盤是一樣的)。但是,它確實會對查詢產生影響,因為當MySql創建臨時表(SORT,ORDER等)時,VARCHAR會轉換為CHAR,轉換后的CHAR的長度就是varchar的長度,在內存中的空間就變大了,在排序、統計時候需要掃描的就越多,時間就越久。


二、char類型

(1)從碎片角度進行考慮,使用CHAR字符型時,由於存儲空間都是一次性分配的,因此某個字段的內容其實是存儲在一起的。單從這個角度來講,其不存在碎片的困擾。而可變長度的字符數據類型,其存儲的長度是可變的。當其更改前后數據長度不一致時,就不可避免的會出現內存碎片問題。所以在使用可變長度的字符型數據時,數據庫管理員要時不時的對碎片進行整理。如執行數據庫導出導入作業,來消除碎片。

(2)考慮其長度是否相近,如果某個字段其長度雖然比較長,但是其長度總是近似的,如一般在90個到100個字符之間,甚至是相同的長度。此時比較適合采用CHAR字符類型。比較典型的應用就是MD5哈希值。當利用MD5哈希值來存儲用戶密碼時,就非常使用采用CHAR字符類型。因為其長度是相同的。另外,像用來存儲用戶的身份證號碼等等,一般也建議使用CHAR類型的數據。

CHAR(1)與VARCHAR(1)兩這個定義,會有什么區別呢?

雖然這兩個都只能夠用來保存單個的字符,但是VARCHAR要比CHAR多占用一個存儲位置。這主要是因為使用VARCHAR數據類型時,會多用1個字節用來存儲長度信息。這個管理上的開銷char字符類型是沒有的。


三、總結

雖然char和varchar二者在磁盤上存儲時實際占用的空間是一樣的。但他們仍有區別。

主要區別有兩點:

(1)varchar是變長的,char是固定長度;

(2)兩者在內存中的操作方式不同,varchar是按照最長的方式在內存中進行操作的。比如說要進行排序的時候,varcahr(100)是按照100這個長度來進行的,即使實際沒有存儲100個字符。


參考博文:
(1) https://www.cnblogs.com/zhuyeshen/p/11642211.html (char與varchar的區別與聯系)
(2) https://www.cnblogs.com/jasonboren/p/11361995.html (mysql數據類型)
(3)https://www.jianshu.com/p/08eff7720c6f (mysql varchar長度的設置問題,分析比較到位)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM