日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在MySQL數據庫中,用的最多的字符型數據類型就是Varchar和Char.。這兩種數據類型雖然都是用來存放字符型數據,但是無論從結構還是從數?據的保存方式來看,兩者相差很大。而且其具體的實現方式,還依賴與存儲引擎。我這里就以大家最常用的MYISAM存儲引擎為例,談談這兩種數據類型的差?異。在后續建議中,也是針對這種存儲類型而言的。

這里首先需要明白的一點是,這兩種數據類型,無論采用哪一種存儲引起,系統存儲數據的方式都是不同的。正是因為如此,我們才有必要研究兩者的不同。然后在合適的情況下,采用恰當的方式。了解這一點之后,我們再來看后續的內容。

Varchar往往用來保存可變長度的字符串。簡單的說,我們只是給其固定了一個最大值,然后系統會根據實際存儲的數據量來分配合適的存儲空間。為此相?比CHAR字符數據而言,其能夠比固定長度類型占用更少的存儲空間。不過在實際工作中,由于某系特殊的原因,會在這里設置例外。如管理員可以根據需要指定ROW_FORMAT=FIXEDChina?sunglasses?manufacturer?選項。利用這個選項來創建MyISAM表的話,系統將會為每一行使用固定長度的空間。此時會造成存儲空間的損耗。通常情?況下,VARCHAR數據類型能夠節約磁盤空間,為此往往認為其能夠提升數據庫的性能。不過這里需要注意的是,這往往是一把雙刃劍。其在提升性能的同時,?往往也會產生一些副作用。如因為其長度是可變的,為此在數據進行更新時可能會導致一些額外的工作。如在更改前,其字符長度是10位(Varchar規定的?最長字符數假設是50位),此時系統就只給其分配10個存儲的位置(假設不考慮系統自身的開銷)。更改后,其數據量達到了20位。由于沒有超過最大50位?的限制,為此數據庫還是允許其存儲的。只是其原先的存儲位置已經無法滿足其存儲的需求。此時系統就需要進行額外的操作。如根據存儲引擎不同,有的會采用拆?分機制,而有的則會采用分頁機制。

CHAR數據類型與VARCHAR數據類型不同,其采用的是固定長度的存儲方式。簡單的說,就是系統總為其分配最大的存儲空間。當數據保存時,即使其沒?有達到最大的長度,系統也會為其分配這么多的存儲空間。顯然,這種存儲方式會造成磁盤空間的浪費。這里筆者需要提醒的一點是,當字符位數不足時,系統并不?會采用空格來填充。相反,如果在保存CHAR值的時候,如果其后面有空值,系統還會自動過濾其空格。而在進行數據比較時,系統又會將空格填充到字符串的末?尾。

顯然,VARCHAR與CHAR兩種字符型數據類型相比,最大的差異就是前者是可變長度,而后者則是固定長度。在存儲時,前者會根據實際存儲的數據來分?配最終的存儲空間。而后者則不管實際存儲數據的長度,都是根據CHAR規定的長度來分配存儲空間。這是否意味著CHARSunglasses?Distributor的數據類型劣于VARCHAR呢?其實不然。否則的話,就沒有必要存在CHAR字符類型了。雖然VARCHAR數據類型可以節省存儲空間,提高數據處理的效率。但是其可變長度帶來的一些負?面效應,有時候會抵消其帶來的優勢。為此在某些情況下,還是需要使用Char數據類型。

二、項目建議

根據上面的分析,我們知道VARCHAR數據類型是一把雙刃劍,其在帶來性能提升的同時,也可能會存在著一些額外的消耗。我們在評估到底是使用VARCHAR數據類型還是采用CHAR數據類型時,就需要進行均衡。在實際項目中,我們會考量如下情況。

一是根據字符的長度來判斷。如某個字段,像人的名字,其最長的長度也是有限的。如我們給其分配18個字符長度即可。此時雖然每個人的名字長度有可能不?同,但是即使為其分配了固定長度的字符類型,即18個字符長度,最后浪費的空間也不是很大。而如果采用NVARCHAR數據類型時,萬一以后需要改名,而?原先的存儲空間不足用來容納新的值,反而會造成一些額外的工作。在這種情況下,進行均衡時,會認為采用CHAR固定長度的數據類型更好。在實際項目中,如?果某個字段的字符長度比較短此時一般是采用固定字符長度。

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

另外請大家考慮一個問題,CHAR(1)Best?price?sunglasses與VARCHAR(1)兩這個定義,會有什么區別呢?雖然這兩個都只能夠用來保存單個的字符,但是VARCHAR要比CHAR多占用一個存儲位置。這主要是因為使用VARCHAR數據類型時,會多用1個字節用來存儲長度信息。這個管理上的開銷CHAR字符類型是沒有的。

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

四是即使使用Varchar數據類型,也不能夠太過于慷慨。這是什么意思呢?如現在用戶需要存儲一個地址信息。根據評估,只要使用100個字符就可以?了。但是有些數據庫管理員會認為,反正Varchar數據類型是根據實際的需要來分配長度的。還不如給其大一點的呢。為此他們可能會為這個字段一次性分配200個字符的存儲空間。這VARCHAR(100)與VARCHAR(200)真的相同嗎?結果是否定的。雖然他們用來存儲90個字符的數據,其存儲空?間相同。但是對于內存的消耗是不同的。對于VARCHAR數據類型來說,硬盤上的存儲空間雖然都是根據實際字符長度來分配存儲空間的,但是對于內存來說,?則不是。其時使用固定大小的內存塊來保存值。簡單的說,就是使用字符類型中定義的長度,即200個字符空間。顯然,這對于排序或者臨時表(這些內容都需要?通過內存來實現)作業會產生比較大的不利影響。所以如果某些字段會涉及到文件排序或者基于磁盤的臨時表時,分配VARCHAR數據類型時仍然不能夠太過于?慷慨。還是要評估實際需要的長度,然后選擇一個最長的字段來設置字符長度。如果為了考慮冗余,可以留10%左右的字符長度。千萬不能認為其為根據實際長度?來分配存儲空間,而隨意的分配長度,或者說干脆使用最大的字符長度。

總結

以上是生活随笔為你收集整理的mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。