MySQL中varchar 和char型別介紹

2021-09-25 18:34:49 字數 1885 閱讀 3031

varchar 和char型別是兩種最重要的字串型別,在儲存引擎是innodb或myisam下,討論varchar和char。

一、varchar型別:

varchar:用於可變長字串,是最常見的字串資料型別。它比定長型別更節省空間,按照儲存的實際字串長度分配空間。varchar需使用1或2個額外位元組記錄字串的長度:如果列的最大長度小於或等於255位元組,則只使用1個位元組表示,否則使用2個位元組。varchar節省了儲存空間,所以對效能也有幫助,但是,由於行是變長的,在update時可能使行變得比原來更長,如果乙個行占用的空間增長,並且在頁內沒有更多的空間可以儲存,innodb則需要**頁來使行可以放進頁內。

使用varchar合適的情況:  1)字串列的最大長度比平均長度大很多  2)列的更新很少,所以碎片不是問題 3)使用utf-8這樣複雜的字符集,每個字元都使用不同的位元組進行儲存。

*varchar(m),在4.0以下版本,m代表位元組數,5.0以上版本,m代表字元數。在mysql5.0以上版本中,varchar資料型別的長度支援到了65535個位元組,也就是說可以存放65532個位元組的資料,起始位和結束位占去了3個位元組。

eg: varchar(20),指的是20個字元,無論存放的是數字,字母還是utf-8漢子(每個漢字3個位元組),都可以存放20個,最大大小是65532位元組。

varchar規則:

a)  儲存限制:varchar欄位是將實際內容單獨儲存在聚簇索引之外,內容開頭用1到2個位元組表示實際長度(長度超過255位元組時需要用到2個位元組),因此最大長度不超過65535.

b)  編碼長度限制: 字元型別為gbk,每個字元最多佔2個位元組,最大長度不能超過32766;字元型別為utf8, 每個字元最多占用3個位元組,最大長度不能超過21845。

c)行長度限制:mysql要求乙個行的長度不能超過65535。

在5.0或更高的版本,varchar型別在儲存和檢索時會保留末尾空格。

二、char 型別:

char: mysql總是根據定義的字串長度分配足夠的空間。當儲存char值時,mysql會刪除所有的末尾空格。當儲存的字串長度小於分配長度,採用空格進行填充。

使用char合適的情況:1)適合儲存很多的字串或者所有值都接近同乙個長度   2)對於經常變更的資料,char也比varchar更好,因為定長的char型別不易產生碎片。 3)對於非常短的列,varchar還需要乙個記錄長度的額外位元組

*char(m)在4.0以下版本,m代表位元組數,5.0以上版本,m代表字元數。

char(m)最大位元組數255,比指定長度大的值將被擷取,而比指定長度小的值將會用空格做填充。char型別的字串檢索速度要比varchar型別快。

在mysql中用來判斷是否需要進行對資料列型別轉換的規則:

1、在乙個資料表裡,如果每乙個資料列的長度都是固定的,那麼每乙個資料行的長度也將是固定的。

2、只要資料表裡有乙個資料列的長度是可變的,那麼各資料行的長度都是可變的。

3、如果某個資料表裡的資料行的長度是可變的,那麼,為了節約儲存空間,mysql會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別。例外:長度小於4個字元的char資料列不會被轉換為varchar型別。

效率來說基本是   char>varchar>text,但是如果使用innodb引擎的話,推薦使用varchar代替char。

擴充套件:乙個字元等於幾個位元組?

對於不同的編碼,不同的字元所佔的位元組是不同的。

ascii碼:ascii嚴格來講就是7個bit大小的字符集,也就是介於0-127之間的字元集合,每個ascii中的字元占用乙個位元組。

utf-8編碼:乙個英文本元等於乙個位元組(與ascii一樣的字元都佔乙個位元組),乙個中文(含繁體)等於三個位元組(有時是四個)。

latin:(iso-8859-1):是7 bit ascii字符集的擴充的一種,是8個bit大小的字符集,占用乙個位元組。

MySql中varchar和varchar的區別

看了新公司的資料庫設計,有些問題思考了一下,寫這篇文章也就記錄這個問題的思考過程。首先從占用空間進行比較,varchar 10 宣告10個位元組,資料儲存時額外乙個位元組的長度字首 varchar 1000 宣告1000個位元組,如果資料長度大於255,長度字首是兩個位元組。而實際varchar資料...

mysql中char和varchar區別

結論 char 定長,效率高 varchar 不定長,效率低。char是一種固定長度的型別,varchar則是一種可變長度的型別,它們的區別是 char m 型別的資料列裡,每個值都占用m個位元組,如果某個長度小於m,mysql就會在它的右邊用空格字元補足 在檢索操作中那些填補出來的空格字元將被去掉...

由MySQL中char和varchar效率想到的

一般認為空間換時間,現在磁碟又大又不值錢 當使用全表都是char這的字段的時候,那麼表屬性row format是fixed也就是靜態表,與之對應的自然就是動態表dynamic,靜態錶比動態表效率要高,主要是因為,基於兩點 1 沒有碎片,每行的長度是固定,所以在頻繁更新的場景下,尤其是某個欄位由小變大...