1. 程式人生 > >mysql 中Varchar 與char的區別

mysql 中Varchar 與char的區別

計算機 一個 個數 arc eat 每一個 set span 方式

一、字符與字節與編碼關系

ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0,最大值255。

UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。

Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。

二、Varchar與char區別

char固定長度的類型:char(M)類型的數據列裏,每個值都占用M個字節,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉).
varchar可變長度的類型:

在varchar(M)類型的數據列裏,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節)

在MySQL中用來判斷是否需要進行對數據列類型轉換的規則

  • 在一個數據表裏,如果每一個數據列的長度都是固定的,那麽每一個數據行的長度也將是固定的.

  • 只要數據表裏有一個數據列的長度的可變的,那麽各數據行的長度都是可變的.

  • 如果某個數據表裏的數據行的長度是可變的,那麽,為了節約存儲空間,MySQL會把這個數據表裏的固定長度類型的數據列轉換為相應的可變長度類型.例外:長度小於4個字符的char數據列不會被轉換varchar類型

在mysql中,char和varchar都表示字符串類型.但他們存儲和檢索數據的方式並不相同.

在表結構定義中聲明char和varchar類型時,必須指定字符串的長度.也就是該列所能存儲多少個字符(不是字節,是字符).例如:char(10)和varchar(10)都能存儲10個字符.

聲明為char的列長度是固定的,char的長度可選範圍在0-255之間.也就是char最大能存儲255個字符.如果該列是utf8編碼,則該列所占用的字節數=字符數3.如果是gbk編碼則該列所占用的字節數=字符數2.

聲明為varchar的列長度是可變的,mysql5.7.2 varchar的長度範圍為0-65535個字節.采用varchar類型存儲數據需要1-2個字節(長度超過255時需要2個字節)來存儲字符串的實際長度.如果該列的編碼為gbk,每個字符最多占用2個字節,最大長度不能超過32766個字符.如果該列的編碼為utf8,每個字符最多占3個字節,最大字符長度為21845.

總結:

  1. char和varchar最大的不同就是一個是固定長度,一個是可變長度.由於是可變長度,因此存儲的是實際字符串再加上一個記錄字符串長度的字節。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.

  2. varchar(M)和char(M),M都表示字符數.varchar的最大長度為65535個字節(字符長度為utf8下21845),不同的編碼所對應的最大可存儲的字符數不同.char最多可以存放255個字符,不同的編碼最大可用字節數不同.

三、utf8和gbk編碼下的計算方式實例

GBK下: 若一個表只有一個varchar類型,如定義為

  create table t4(c varchar(N)) charset=gbk;

  則此處N的最大值為(65535-1-2)/2= 32766。

  減1的原因是實際行存儲從第二個字節開始’;

  減2的原因是varchar頭部的2個字節表示長度;

  除2的原因是字符編碼是gbk。

UTF8下:
  create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

  則此處N的最大值為 (65535-1-2-4-30*3)/3=21812

  減1和減2與上例相同;

  減4的原因是int類型的c占4個字節;

  減30*3的原因是char(30)占用90個字節,編碼是utf8。

mysql 中Varchar 與char的區別