請認真對待資料庫中的char 與varchar

2021-06-08 16:45:28 字數 1242 閱讀 4309

做完學生管理系統的那會,發現乙個問題。使用者名稱後加了幾個空格有時候照樣可以登入系統,這可是我們想要的。下面就這個問題說下char與varchar的區別吧

先說下他們的工作方式

char 是固定長度的字元型,varchar是可變長度的字元。舉個例子,比如設定兩個字段

cardid char(10), stuid varchar(10).當給這連個字段插入資料時,

輸入資料

char型別的字段內容

varchar型別的字段內容

aaaaaa  

(aaa後面還有7個空格)

aaa(aaa後面沒有空格)

aaabbb

aaabbb

aaabbb

aaabbbcccccc

出錯,將截斷字串或二進位制資料

出錯,將截斷字串或二進位制資料

由上表可以看出,對於char型別的資料來會所,如果新增的自如長度不夠,sql 自動用空格補齊,而varchar則不會自動補齊空格。

也就是說char型別的資料長度 = 定義的長度,而varchar型別的資料長度 <= 定義的最大長度。

char型別,固定字長,效率高,但是會比varchar多占用空間;varchar型別,可變字長,節省空間,但是效率比char稍差。

由於他們的特性,決定了他們的而是用情況

char使用迴避varchar多謝,我們不是太卻空間,而且效率會提高我們的產品的認可率。這就是資料庫設計中常用到的「以空間換效率」

此外, varchar 雖然比char節省空間,但是如果乙個varchar列經常被修改,而且每次被修改的資料的長度不同,這會引起『行遷移』(row migration)現象(oracle中較為明顯),而這造成多餘的i/o,是資料庫設計和調整中要盡力避免的,在這種情況下用char代替varchar效果會更好一些。

但是用char時要時刻注意空格問題。由於char會自動補齊空格,所以在輸入資料長度小於定義的最大長度時,輸入"a" 和輸入"a "是一樣的。因為它們最終後面會補齊空格而變成相同的內容。假如該列有主鍵約束或者唯一性約束,那麼就會發生錯誤,因為違反了「實體完整性」約束。當然如果沒有這些約束,同樣也會出現錯誤。就拿我們剛做的機房收費系統的登入模組來說吧,如果把密碼定義成了char型別,那麼把設定密碼為「admin  」,而我用「admin」可以順利登入,這顯然不是使用者想看到的。追求效率是對的,但是前提是保證其正確性。所以我認為一些特定的必須要用varchar,比如密碼。

MySQL資料庫中CHAR與VARCHAR之爭

在資料庫中,字元型的資料是最多的,可以佔到整個資料庫的80 以上。為此正確處理字元型的資料,對於提高資料庫的效能有很大的作用。在字元型資料中,用的最多的就是char與varchar兩種型別。前面的是固定長度,而後面的是可變長度。現在我們需要考慮的是,在什麼情況下使用char字元型資料,什麼情況下採用...

MySQL資料庫中CHAR與VARCHAR之爭

在資料庫中,字元型的資料是最多的,可以佔到整個資料庫的80 以上。為此正確處理字元型的資料,對於提高資料庫的效能有很大的作用。在字元型資料中,用的最多的就是char與varchar兩種型別。前面的是固定長度,而後面的是可變長度。現在我們需要考慮的是,在什麼情況下使用char字元型資料,什麼情況下採用...

MySQL資料庫中CHAR與VARCHAR之爭

一 varchar與char字元型資料的差異 在mysql資料庫中,用的最多的字元型資料型別就是varchar和char.這兩種資料型別雖然都是用來存放字元型資料,但是無論從結構還是從數 據的儲存方式來看,兩者相差很大。而且其具體的實現方式,還依賴與儲存引擎。我這裡就以大家最常用的myisam儲存引...