电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL CHAR和VARCHAR存儲、讀取時的差別

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

導讀

你真的知道CHAR和VARCHAR類型在存儲和讀取時的區別嗎?

還是先拋幾條結論吧:

1、存儲的時候,CHAR總是會補足空格后再存儲,不管用戶插入數據時尾部有沒有包含空格。

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

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

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

下面是測試驗證過程。

1、測試CHAR類型

表結構:

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, ’’);

查看存儲結構:

(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

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

可以看到,無論我們存儲多長的字符串進去,每條記錄實際都是占用43(169-126=43)字節。由此結論1成立。簡單說下,43字節的由來:DB_TRX_ID, 6字節。DB_ROLL_PTR, 7字節。id, int, 4字節。c1, char(20), 20字節;因為是CHAR類型,還需要額外1字節。每條記錄總是需要額外5字節頭信息(row header)。這樣總的加起來就是43字節了。

再看下讀取tchar表的結果:

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 | <- 刪除尾部空格,結果和id=5一樣| 5 | 000$$$ | 0 |+----+----------------------------+------------+

2、測試VARCHAR類型

表結構:

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, ’’);

查看存儲結構:

(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

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

再看下讀取tvarchar表的結果:

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

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

最后,來看下文檔里怎么說的:

When CHAR values are stored, they are right-padded with spaces to thespecified length. 簡言之,CHAR列在存儲時尾部加空格補齊長度。

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

VARCHAR values are not padded when they are stored.簡言之,存VARCHAR時尾部不加空格。

Trailing spaces are retained when values are stored and retrieved, inconformance with standard SQL. 簡言之,讀取VARCHAR時會顯示空格。

以上測試使用的版本及環境:

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存儲的差別的詳細內容,更多關于MySQL CHAR和VARCHAR的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 烟台螺纹,烟台H型钢,烟台钢材,烟台角钢-烟台市正丰金属材料有限公司 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 千淘酒店差旅平台-中国第一家针对TMC行业的酒店资源供应平台 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 100国际学校招生 - 专业国际学校择校升学规划| 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 球盟会·(中国)官方网站 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 工业制氮机_psa制氮机厂家-宏骁智能装备科技江苏有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | IP检测-检测您的IP质量| 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 必胜高考网_全国高考备考和志愿填报信息平台 | 我爱古诗词_古诗词名句赏析学习平台| 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 |