av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL CHAR和VARCHAR存儲(chǔ)、讀取時(shí)的差別

瀏覽:3日期:2023-10-09 17:55:52

導(dǎo)讀

你真的知道CHAR和VARCHAR類型在存儲(chǔ)和讀取時(shí)的區(qū)別嗎?

還是先拋幾條結(jié)論吧:

1、存儲(chǔ)的時(shí)候,CHAR總是會(huì)補(bǔ)足空格后再存儲(chǔ),不管用戶插入數(shù)據(jù)時(shí)尾部有沒(méi)有包含空格。

2、存儲(chǔ)的時(shí)候,VARCHAR不會(huì)先補(bǔ)足空格后再存儲(chǔ),但如果是用戶在插入時(shí)特地加了空格那就會(huì)如實(shí)存儲(chǔ),而不會(huì)給刪除。

3、讀取數(shù)據(jù)時(shí),CHAR總是會(huì)刪除尾部空格(哪怕是寫入時(shí)包含空格)。

4、讀取數(shù)據(jù)時(shí),VARCHAR總是如實(shí)取出之前存入的值(如果存儲(chǔ)時(shí)尾部包含空格,就會(huì)繼續(xù)保留著,不會(huì)像CHAR那樣刪除尾部空格)。

下面是測(cè)試驗(yàn)證過(guò)程。

1、測(cè)試CHAR類型

表結(jié)構(gòu):

CREATE TABLE `tchar` ( `id` int(10) unsigned NOT NULL DEFAULT ’0’, `c1` char(20) NOT NULL DEFAULT ’’, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入幾條記錄:

insert into tchar values (1, concat(’a’, repeat(’ ’,19)));insert into tchar values (2, concat(’ ’, repeat(’a’,19)));insert into tchar values (3, ’a’);insert into tchar values (4, ’ ’);insert into tchar values (5, ’’);

查看存儲(chǔ)結(jié)構(gòu):

(1) INFIMUM record offset:99 heapno:0 ...(2) SUPREMUM record offset:112 heapno:1 ...(3) normal record offset:126 heapno:2 ... <- id=1(4) normal record offset:169 heapno:3 ... <- id=2(5) normal record offset:212 heapno:4 ... <- id=3(6) normal record offset:255 heapno:5 ... <- id=4(7) normal record offset:298 heapno:6 ... <- id=5

看到這坨東西有點(diǎn)懵是不是,還記得我給你們安利過(guò)的一個(gè)工具不,看這里:innblock | InnoDB page觀察利器。

可以看到,無(wú)論我們存儲(chǔ)多長(zhǎng)的字符串進(jìn)去,每條記錄實(shí)際都是占用43(169-126=43)字節(jié)。由此結(jié)論1成立。簡(jiǎn)單說(shuō)下,43字節(jié)的由來(lái):DB_TRX_ID, 6字節(jié)。DB_ROLL_PTR, 7字節(jié)。id, int, 4字節(jié)。c1, char(20), 20字節(jié);因?yàn)槭荂HAR類型,還需要額外1字節(jié)。每條記錄總是需要額外5字節(jié)頭信息(row header)。這樣總的加起來(lái)就是43字節(jié)了。

再看下讀取tchar表的結(jié)果:

select id,concat(’000’,c1,’$$$’),length(c1) from tchar ;+----+----------------------------+------------+| id | concat(’000’,c1,’$$$’) | length(c1) |+----+----------------------------+------------+| 1 | 000a$$$ | 1 | <- 刪除尾部空格| 2 | 000 aaaaaaaaaaaaaaaaaaa$$$ | 20 || 3 | 000a$$$ | 1 || 4 | 000$$$ | 0 | <- 刪除尾部空格,結(jié)果和id=5一樣| 5 | 000$$$ | 0 |+----+----------------------------+------------+

2、測(cè)試VARCHAR類型

表結(jié)構(gòu):

CREATE TABLE `tvarchar` ( `id` int(10) unsigned NOT NULL DEFAULT ’0’, `c1` varchar(20) NOT NULL DEFAULT ’’, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

插入幾條記錄:

insert into tvarchar values (1, concat(’a’, repeat(’ ’,19)));insert into tvarchar values (2, concat(’ ’, repeat(’a’,19)));insert into tvarchar values (3, ’a’);insert into tvarchar values (4, ’ ’);insert into tvarchar values (5, ’’);insert into tvarchar values (6, ’’);

查看存儲(chǔ)結(jié)構(gòu):

(1) INFIMUM record offset:99 heapno:0 ...(2) SUPREMUM record offset:112 heapno:1 ...(3) normal record offset:126 heapno:2 ... <- id=1(4) normal record offset:169 heapno:3 ... <- id=2(5) normal record offset:212 heapno:4 ... <- id=3(6) normal record offset:236 heapno:5 ... <- id=4(7) normal record offset:260 heapno:6 ... <- id=5(8) normal record offset:283 heapno:7 ... <- id=6

可以看到,幾條記錄的字節(jié)數(shù)分別是:43、43、24、24、23、23(最后一條記錄和id=5那條記錄一樣)。對(duì)上面這個(gè)結(jié)果有點(diǎn)詫異是不是,尤其是id=1的記錄(插入的是’a…后面19個(gè)空格’),居然也要消耗43字節(jié),這就佐證了上面的結(jié)論2。同樣的,id=3和id=4這兩條記錄都是占用24字節(jié),而id=5和id=6這兩條記錄都是占用23字節(jié)(沒(méi)有額外存儲(chǔ)字符串的字節(jié)數(shù),只有id列4個(gè)字節(jié))。

再看下讀取tvarchar表的結(jié)果:

select id,concat(’000’,c1,’$$$’),length(c1) from tvarchar;+----+----------------------------+------------+| id | concat(’000’,c1,’$$$’) | length(c1) |+----+----------------------------+------------+| 1 | 000a $$$ | 20 | <- 讀取結(jié)果中沒(méi)有刪除尾部的空格| 2 | 000 aaaaaaaaaaaaaaaaaaa$$$ | 20 || 3 | 000a$$$ | 1 || 4 | 000 $$$ | 1 | <- 讀取結(jié)果中沒(méi)有刪除此空格| 5 | 000$$$ | 0 || 6 | 000$$$ | 0 |+----+----------------------------+------------+

總的來(lái)說(shuō),可以總結(jié)成兩條結(jié)論:1、從讀取的結(jié)果來(lái)看,CHAR類型列看起來(lái)像是在存儲(chǔ)時(shí)把空格給吃了,但實(shí)際上只是在讀取時(shí)才給吃了(顯示層面上把空格刪除了)。2、從讀取的結(jié)果來(lái)看,VARCHAR類型列看起來(lái)像是反倒保留了多余的空格,實(shí)際上也是只在讀取時(shí)才恢復(fù)這些空格(但實(shí)際物理存儲(chǔ)時(shí)還是會(huì)刪掉這些空格)。

最后,來(lái)看下文檔里怎么說(shuō)的:

When CHAR values are stored, they are right-padded with spaces to thespecified length. 簡(jiǎn)言之,CHAR列在存儲(chǔ)時(shí)尾部加空格補(bǔ)齊長(zhǎng)度。

When CHAR values are retrieved, trailing spaces are removed unless thePAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.簡(jiǎn)言之,CHAR列在讀取時(shí)會(huì)去掉尾部空格,除非設(shè)置sql_mode值PAD_CHAR_TO_FULL_LENGTH=1。

VARCHAR values are not padded when they are stored.簡(jiǎn)言之,存VARCHAR時(shí)尾部不加空格。

Trailing spaces are retained when values are stored and retrieved, inconformance with standard SQL. 簡(jiǎn)言之,讀取VARCHAR時(shí)會(huì)顯示空格。

以上測(cè)試使用的版本及環(huán)境:

mysql> select version()G...version(): 8.0.15mysql> select @@sql_modeG...@@sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

參考文檔

11.4.1 The CHAR and VARCHAR Types,https://dev.mysql.com/doc/refman/5.7/en/char.html

以上就是MySQL CHAR和VARCHAR存儲(chǔ)的差別的詳細(xì)內(nèi)容,更多關(guān)于MySQL CHAR和VARCHAR的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
主站蜘蛛池模板: 国产激情视频 | 久久综合久久综合久久综合 | 国产欧美一区二区精品忘忧草 | 欧美精品一区二区三区在线 | 亚洲一二三视频 | 天天射视频 | 亚洲三级av| 日韩av中文| 久久久国产精品入口麻豆 | 日本特黄特色aaa大片免费 | 黄色在线免费观看视频网站 | 午夜久草 | 男人天堂午夜 | 国产成人久久 | 国产精品久久久久久亚洲调教 | 欧美精品在线一区 | 久久久精品视频免费看 | 日韩精品免费视频 | 一区二区三区免费 | 国产韩国精品一区二区三区 | a毛片| 亚洲有码转帖 | 中文成人在线 | 黄色一级视频免费 | 日本激情视频网 | 精品伦精品一区二区三区视频 | 91在线导航| 国产午夜精品一区二区三区 | 欧美一区二区三区四区视频 | 久久久久国产 | 伊人春色成人 | 久色一区 | 盗摄精品av一区二区三区 | 欧美aaa| 国产精品一区在线观看 | 日韩三片 | 中文一区二区视频 | 久久九九免费 | 凹凸日日摸日日碰夜夜 | 国产精品片aa在线观看 | 色噜噜亚洲男人的天堂 |