溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

char和varchar差異

發(fā)布時間:2020-07-17 06:57:30 來源:網(wǎng)絡(luò) 閱讀:835 作者:拍黑磚業(yè)戶 欄目:MySQL數(shù)據(jù)庫

字符與字節(jié)的區(qū)別(查閱引用)

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

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

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

符號:英文標(biāo)點占一個字節(jié),中文標(biāo)點占兩個字節(jié)。舉例:英文句號“.”占1個字節(jié)的大小,中文句號“?!闭?個字節(jié)的大小。

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

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

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

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

存數(shù)據(jù)時的區(qū)別

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

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

char和varchar差異

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI