国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

mysql中char與varchar的區(qū)別分析

2024-07-24 13:03:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
char與varchar的區(qū)別

char (13)長(zhǎng)度固定, 如'm.survivalescaperooms.com' 存儲(chǔ)需要空間 12個(gè)字符

varchar(13) 可變長(zhǎng) 如'm.survivalescaperooms.com' 需要存儲(chǔ)空間 13字符,

從上面可以看得出來(lái)char 長(zhǎng)度是固定的,不管你存儲(chǔ)的數(shù)據(jù)是多少他都會(huì)都固定的長(zhǎng)度。而varchar則處可變長(zhǎng)度但他要在總長(zhǎng)度上加1字符,這個(gè)用來(lái)存儲(chǔ)位置。所以實(shí)際應(yīng)用中用戶可以根據(jù)自己的數(shù)據(jù)類型來(lái)做。

再看看char,與varchar在速度上的區(qū)別吧。

復(fù)制代碼 代碼如下:


mysal>create tabe ab(v varchar(4),c char(4));
query ok ,0 rows affected(0.02 sec)
mysql>insert into abc values('ab ','ab ')
query ok ,1 row affected(0.00 sec);
mysql->select concat(v ,'+') ,concat(c ,'+') form abc
ab + | ab+
1rows in set (0.00 sec)


從上面可以看出來(lái),由于某種原因char 固定長(zhǎng)度,所以在處理速度上要比varchar快速很多,但是對(duì)費(fèi)存儲(chǔ)空間,所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用char類型,反之可以用varchar類型來(lái)實(shí)例。

注明:

在用char字符類型時(shí)內(nèi)容后面有空間時(shí)必須作相關(guān)處理,要不就會(huì)把空格自動(dòng)刪除。

建意:

myisam 存儲(chǔ)引擎 建議使用固定長(zhǎng)度,數(shù)據(jù)列代替可變長(zhǎng)度的數(shù)據(jù)列。
memory存儲(chǔ)引擎 目前都使用固定數(shù)據(jù)行存儲(chǔ),因此無(wú)論使用char varchar列都沒(méi)關(guān)系,
innodb 存儲(chǔ)引擎 建意使用varchar 類型


以下是其它網(wǎng)友的補(bǔ)充


char是一種固定長(zhǎng)度的類型,varchar則是一種可變長(zhǎng)度的類型
  char(M)類型的數(shù)據(jù)列里,每個(gè)值都占用M個(gè)字節(jié),如果某個(gè)長(zhǎng)度小于M,MySQL就會(huì)在它的右邊用空格字符補(bǔ)足.(在檢索操作中那些填補(bǔ)出來(lái)的空格字符將被去掉)在varchar(M)類型的數(shù)據(jù)列里,每個(gè)值只占用剛好夠用的字節(jié)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)(即總長(zhǎng)度為L(zhǎng)+1字節(jié)).

在MySQL中用來(lái)判斷是否需要進(jìn)行對(duì)據(jù)列類型轉(zhuǎn)換的規(guī)則

  1、在一個(gè)數(shù)據(jù)表里,如果每一個(gè)數(shù)據(jù)列的長(zhǎng)度都是固定的,那么每一個(gè)數(shù)據(jù)行的長(zhǎng)度也將是固定的.
  2、只要數(shù)據(jù)表里有一個(gè)數(shù)據(jù)列的長(zhǎng)度的可變的,那么各數(shù)據(jù)行的長(zhǎng)度都是可變的.
  3、如果某個(gè)數(shù)據(jù)表里的數(shù)據(jù)行的長(zhǎng)度是可變的,那么,為了節(jié)約存儲(chǔ)空間,MySQL會(huì)把這個(gè)數(shù)據(jù)表里的固定長(zhǎng)度類型的數(shù)據(jù)列轉(zhuǎn)換為相應(yīng)的可變長(zhǎng)度類型.
例外:長(zhǎng)度小于4個(gè)字符的char數(shù)據(jù)列不會(huì)被轉(zhuǎn)換為varchar類型

  對(duì)于MyISAM表,盡量使用Char,對(duì)于那些經(jīng)常需要修改而容易形成碎片的myisam和isam數(shù)據(jù)表就更是如此,它的缺點(diǎn)就是占用磁盤(pán)空間;

  對(duì)于InnoDB表,因?yàn)樗臄?shù)據(jù)行內(nèi)部存儲(chǔ)格式對(duì)固定長(zhǎng)度的數(shù)據(jù)行和可變長(zhǎng)度的數(shù)據(jù)行不加區(qū)分(所有數(shù)據(jù)行共用一個(gè)表頭部分,這個(gè)標(biāo)頭部分存放著指向各有關(guān)數(shù)據(jù)列的指針),所以使用char類型不見(jiàn)得會(huì)比使用varchar類型好。事實(shí)上,因?yàn)閏har類型通常要比varchar類型占用更多的空間,所以從減少空間占用量和減少磁盤(pán)i/o的角度,使用varchar類型反而更有利.

文章2:
字符應(yīng)該是最常見(jiàn)的一種了,但似乎各個(gè)數(shù)據(jù)庫(kù)都有所不同,比如oracle中就有啥varchar2之類。不過(guò)mysql似乎最多的還是集中在char和varchar上。
說(shuō)說(shuō)區(qū)別。char是固定長(zhǎng)度的,而varchar會(huì)根據(jù)具體的長(zhǎng)度來(lái)使用存儲(chǔ)空間。比如char(255)和varchar(255),在存儲(chǔ)字符串"hello world"的時(shí)候,char會(huì)用一塊255的空間放那個(gè)11個(gè)字符,而varchar就不會(huì)用255個(gè),他先計(jì)算長(zhǎng)度后只用11個(gè)再加上計(jì)算的到字符串長(zhǎng)度信息,一般1-2個(gè)byte來(lái),這樣varchar在存儲(chǔ)不確定長(zhǎng)度的時(shí)候會(huì)大大減少存儲(chǔ)空間。

如此看來(lái)varchar比char聰明多了,那char有用武之地嗎?還是很不少優(yōu)勢(shì)的。

一,存儲(chǔ)很短的信息,比如門(mén)牌號(hào)碼101,201……這樣很短的信息應(yīng)該用char,因?yàn)関archar還要占個(gè)byte用于存儲(chǔ)信息長(zhǎng)度,本來(lái)打算節(jié)約存儲(chǔ)的現(xiàn)在得不償失。

二,固定長(zhǎng)度的。比如使用uuid作為主鍵,那用char應(yīng)該更合適。因?yàn)樗潭ㄩL(zhǎng)度,varchar動(dòng)態(tài)根據(jù)長(zhǎng)度的特性就消失了,而且還要占個(gè)長(zhǎng)度信息。

三,十分頻繁改變的column。因?yàn)関archar每次存儲(chǔ)都要有額外的計(jì)算,得到長(zhǎng)度等工作,如果一個(gè)非常頻繁改變的,那就要有很多的精力用于計(jì)算,而這些對(duì)于char來(lái)說(shuō)是不需要的。


還有一個(gè)關(guān)于varchar的問(wèn)題是,varchar他既然可以自動(dòng)適應(yīng)存儲(chǔ)空間,那我varchar(8)和varchar(255)存儲(chǔ)應(yīng)該都是一樣的,那每次表設(shè)計(jì)的時(shí)候往大的方向去好了,免得以后不夠用麻煩。這個(gè)思路對(duì)嗎?答案是否定的。mysql會(huì)把表信息放到內(nèi)存中(查詢第一次后,就緩存住了,linux下很明顯,但windows下似乎沒(méi)有,不知道為啥),這時(shí)內(nèi)存的申請(qǐng)是按照固定長(zhǎng)度來(lái)的,如果varchar很大就會(huì)有問(wèn)題。所以還是應(yīng)該按需索取。

總結(jié):仔細(xì)看DZ的數(shù)據(jù)表,定長(zhǎng)的字段基本還都是用char....
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滨海县| 东光县| 田东县| 锡林郭勒盟| 莱阳市| 白玉县| 海丰县| 营口市| 上饶县| 龙泉市| 原平市| 海淀区| 图们市| 雅江县| 自贡市| 博白县| 阿荣旗| 祁连县| 中牟县| 察雅县| 资源县| 原平市| 鄢陵县| 肥乡县| 长沙市| 沧州市| 信阳市| 怀宁县| 建阳市| 本溪市| 大连市| 宁河县| 娄烦县| 辽宁省| 定襄县| 肥东县| 吉林省| 拜泉县| 姜堰市| 马龙县| 阿克苏市|