char和vchar
Varchar往往用來保存可變長度的字符串。簡單的說,我們只是給其固定了一個最大值,然后系統會根據實際存儲的數據量來分配合適的存儲空間。
為此相比CHAR字符數據而言,其能夠比固定長度類型占用更少的存儲空間。不過在實際工作中,由于某系特殊的原因,會在這里設置例外。如管理員可以根據需要指定ROW_FORMAT=FIXED選項。利用這個選項來創建MyISAM表的話,系統將會為每一行使用固定長度的空間。此時會造成存儲空間的損耗。通常情況下,VARCHAR數據類型能夠節約磁盤空間,為此往往認為其能夠提升數據庫的性能。不過這里需要注意的是,這往往是一把雙刃劍。
其在提升性能的同時,往往也會產生一些副作用。如因為其長度是可變的,為此在數據進行更新時可能會導致一些額外的工作。
如在更改前,其字符長度是10位(Varchar規定的最長字符數假設是50位),此時系統就只給其分配10個存儲的位置(假設不考慮系統自身的開銷)。
更改后,其數據量達到了20位。由于沒有超過最大50位的限制,為此數據庫還是允許其存儲的。
只是其原先的存儲位置已經無法滿足其存儲的需求。此時系統就需要進行額外的操作。
如根據存儲引擎不同,有的會采用拆分機制,而有的則會采用分頁機制。
?
?
一是根據字符的長度來判斷。
在實際項目中,如果某個字段的字符長度比較短此時一般是采用固定字符長度。
二是考慮其長度的是否相近。
如果某個字段其長度雖然比較長,但是其長度總是近似的,如一般在90個到100個字符之間,甚至是相同的長度。此時比較適合采用CHAR字符類型。
比較典型的應用就是MD5哈希值。當利用MD5哈希值來存儲用戶密碼時,就非常使用采用CHAR字符類型。因為其長度是相同的。另外,像用來存儲用戶的身份證號碼等等,一般也建議使用CHAR類型的數據。
三是從碎片角度進行考慮。
使用CHAR字符型時,由于存儲空間都是一次性分配的。為此某個字段的內容,其都是存儲在一起的。單從這個角度來講,其不存在碎片的困擾。而可變長度的字符數據類型,其存儲的長度是可變的。
當其更改前后數據長度不一致時,就不可避免的會出現碎片的問題。故使用可變長度的字符型數據時,數據庫管理員要時不時的對碎片進行整理。如執行數據庫導出導入作業,來消除碎片。
四是即使使用Varchar數據類型,也不能夠太過于慷慨。
這是什么意思呢?如現在用戶需要存儲一個地址信息。根據評估,只要使用100個字符就可以了。但是有些數據庫管理員會認為,反正Varchar數據類型是根據實際的需要來分配長度的。還不如給其大一點的呢。為此他們可能會為這個字段一次性分配200個字符的存儲空間。這VARCHAR(100)與VARCHAR(200)真的相同嗎?結果是否定的。
雖然他們用來存儲90個字符的數據,其存儲空間相同。但是對于內存的消耗是不同的。對于VARCHAR數據類型來說,硬盤上的存儲空間雖然都是根據實際字符長度來分配存儲空間的,但是對于內存來說,則不是。其時使用固定大小的內存塊來保存值。簡單的說,就是使用字符類型中定義的長度,即200個字符空間。顯然,這對于排序或者臨時表(這些內容都需要通過內存來實現)作業會產生比較大的不利影響。
轉載于:https://www.cnblogs.com/chucklu/p/4363254.html
總結
以上是生活随笔為你收集整理的char和vchar的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis简介与配置MyBatis+
- 下一篇: C#Winform版获取Excel文件的