char和varchar差異

字符與字節的區別(查閱引用)

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

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

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

符號:英文標點佔一個字節,中文標點佔兩個字節。舉例:英文句號“.”佔1個字節的大小,中文句號“。”佔2個字節的大小。

④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。

⑤UTF-32編碼中,世界上任何字符的存儲都需要4個字節。

字節(Byte)是一種計量單位,表示數據量多少,它是計算機信息技術用於計量存儲容量的一種計量單位。

字符是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。

存數據時的區別

char定義的是固定長度,長度範圍爲0-255,存儲時,如果字符數沒有達到定義的位數,會在後面用空格補全存入數據庫中。char最多能存放255個字符個數,和編碼無關。
varchar是變長長度,長度範圍爲0-65535,存儲時,如果字符沒有達到定義的位數,也不會在後面補空格。對於varchar,理論上最多能存放65535個字符,varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535字符。當用到utf-8編碼時候最多可以存21844個字符,在gbk編碼下最多可以有32766個字符,Latin1 一個字符佔一個字節,最多能存放 65532 個字符。
GBK編碼計算方式:
若一個表只有一個varchar類型:
char和varchar差異
32766=(65535-1-2)/2。
減1的原因是實際存儲從第二字節開始;
減2的原因是varchar頭部的2個字節表示長度;
除2的原因是字符編碼是gbk;
UTF8計算方式:
char和varchar差異
32766=(65535-1-2)/3。
減1的原因是實際存儲從第二字節開始;
減2的原因是varchar頭部的2個字節表示長度;
實際例子:
create table t11(c int, c2 char(30), c3 varchar(21812)) charset=utf8;
char和varchar差異
減1的原因是實際存儲從第二字節開始;
減2的原因是varchar頭部的2個字節表示長度;
減4的原因是int類型的c佔4個字節;
減30*3的原因是char(30)佔用90個字節,編碼是utf8。

取數據區別
數據庫取char字段的數據的時候會把空格去掉,但是在取varchar字段的數據時,數據的尾部空格會保留
char和varchar差異
char和varchar差異

char和varchar差異

存儲引擎對於選擇CHAR和VARCHAR的影響:
對於MyISAM存儲引擎:最好使用固定長度的數據列代替可變長度的數據列。這樣可以使 整個表靜態化,從而使數據檢索更快,用空間換時間。
對於InnoDB存儲引擎:使用可變長度的數據列,因爲InnoDB數據表的存儲格式不分固定 長度和可變長度,因此使用CHAR不一定比使用VARCHAR更好,但由於VARCHAR是按照 實際的長度存儲,比較節省空間,所以對磁盤I/O和數據存儲總量比較好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章