一场由Char/Varchar 引起的战争

深入解析Oracle数据库日文排序机制与ORDER BY实战 简介:在Oracle数据库中,排序是SQL查询的关键环节,尤其在日本外包开发中,日文排序的准确性至关重要。本文详细探讨了Oracle支持的多种排序规则,包括JIS和Unicode,涵盖字符编码、重音处理、全角半角差异以及平假名、片假名和汉字的排序逻辑。通过NLS_SORT参数配置、ORDER BY子句应用及动态排序实现,帮助开发者掌握高效准确的日文排序方法,并结合性能优化与测试验证策略,提升系统整体查询效率与稳定性。 阅读详情

众所周知在MySQL中Varchar和Char是两种最主要的字符串类型,最近在帮读者解决一个问题的时候,我和他针对Char和Varchar这两种类型一定的分歧!

Char和Varchar这两种类型是我们经常使用的类型,在使用的时候大家也没有特别注意有什么区别,由于进取心(死磕到底)驱使我对其进行探究,经过查阅一番资料手册以及做的小测试,有了一定程度的了解,特此记录下来!

PS:当然,除开这些,我还整理了一些技术资料和面试题集,供大家提升进阶,不管你是有跳槽打算还是单纯精进自己,都可以免费领取一份。

从面试简历模板到大厂面经汇总,从大厂内部技术资料到互联网高薪必读书单,以及Java面试核心知识点(283页)和Java面试题合集2022年最新版(485页)等等

领取方式在文末,有需要的可以看一下

正文

手册中有提到:Char和Varchar类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

稍微进一步的解释:

Char和Varchar类型声明长度表示用户想保存的最大字符数,其中Char(M)定义的列的长度为固定的,M的取值可以0-255之间,当保存Char值时,在它们的右边填充空格以达到指定的长度。当检索到Char值时,尾部的空格被删除掉(如下图)。在存储或检索过程中不进行大小写转换。Char存储定长数据很方便,Char字段上的索引效率很高。

Varchar(M)定义的列的长度是可变长度字符串,在MySQL5.0以上的版本中,Varchar的数据类型总长度支持到了65535,因为起始位和结束位占去了3个字节,所以其整体最大长度为65532字节(Varchar的最大有效长度由最大行大小和使用的字符集确定)。PS:65535的值是乌龟的腚--规定(MySQL的Vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532。)

除此之外,与Char比,Varchar值保存时只保存需要的字符数,另加一个字节来记录长度(长度超过255时需要2个字节)。

        

同样在Char和Varchar尾部加空格,检索时Char类型后的被删掉,而Varchar类型的保存。

总结:

在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char。这两种数据类型虽然都是用来存放字符型数据,但是无论从结构还是从数据的保存方式来看,两者相差很大。而且其具体的实现方式,还依赖与存储引擎。这里就以大家最常用的MYISAM存储引擎为例,谈谈这两种数据类型的差异。

这里首先需要明白的一点是,这两种数据类型,无论采用哪一种存储引起,系统存储数据的方式都是不同的。正是因为如此,我们才有必要研究两者的不同。然后在合适的情况下,采用恰当的方式。

Varchar往往用来保存可变长度的字符串。简单的说,我们只是给其固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间。为此相比Char字符数据而言,其能够比固定长度类型占用更少的存储空间。不过在实际工作中,由于某系特殊的原因,会在这里设置例外。如管理员可以根据需要指定ROW_FORMAT=FIXED选项。利用这个选项来创建MyISAM表的话,系统将会为每一行使用固定长度的空间,此时会造成存储空间的损耗。通常情况下,Varchar数据类型能够节约磁盘空间,为此往往认为其能够提升数据库的性能。

不过这里需要注意的是,这往往是一把双刃剑。其在提升性能的同时,往往也会产生一些副作用。如因为其长度是可变的,为此在数据进行更新时可能会导致一些额外的工作。如在更改前,其字符长度是10位(Varchar规定的最长字符数假设是50位),此时系统就只给其分配10个存储的位置(假设不考虑系统自身的开销)。更改后,其数据量达到了20位。由于没有超过最大50位的限制,为此数据库还是允许其存储的。只是其原先的存储位置已经无法满足其存储的需求。此时系统就需要进行额外的操作。如根据存储引擎不同,有的会采用拆分机制,而有的则会采用分页机制。

Char数据类型与Varchar数据类型不同,其采用的是固定长度的存储方式。简单的说,就是系统总为其分配最大的存储空间。当数据保存时,即使其没有达到最大的长度,系统也会为其分配这么多的存储空间。显然,这种存储方式会造成磁盘空间的浪费。这里笔者需要提醒的一点是,当字符位数不足时,系统并不会采用空格来填充。相反,如果在保存Char值的时候,如果其后面有空值,系统还会自动过滤其空格。而在进行数据比较时,系统又会将空格填充到字符串的末尾。

显然,Varchar与Char两种字符型数据类型相比,最大的差异就是前者是可变长度,而后者则是固定长度。在存储时,前者会根据实际存储的数据来分配最终的存储空间。而后者则不管实际存储数据的长度,都是根据Char规定的长度来分配存储空间。这是否意味着Char的数据类型劣于Varchar呢?其实不然。否则的话,就没有必要存在Char字符类型了。虽然Varchar数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一些负面效应,有时候会抵消其带来的优势。为此在某些情况下,还是需要使用Char数据类型。

注意:

使用Varchar数据类型,也不能够太过于慷慨。这是什么意思呢?如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这Varchar(100)与Varchar(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于Varchar数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其实使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配Varchar数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

适用情况:

1. 对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间;

2. 对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用Char类型不见得会比使用Varchar类型好。事实上,因为Char类型通常要比Varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用Varchar类型反而更有利;

3. 存储很短的信息,比如门牌号码101,201……这样很短的信息应该用Char,因为Varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

4. 固定长度的。比如使用uuid作为主键,那用Char应该更合适。因为他固定长度,Varchar动态根据长度的特性就消失了,而且还要占个长度信息。

5. 十分频繁改变的column。因为Varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于Char来说是不需要的。

 

今天的分享就到这里,前面说了给大家也准备了一点福利,都是自己整理汇总来的精华,有需要的直接加微信备注“222”即可免费领取。

 

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

Oracle恢复学习实战小结

     学习oracle10g 043课程有段时间了,前一两个星期学习了backup/restore相关的内容,刚好公司有要求要为host服务器做一个备用机以防止数据意外丢失。于是,实战开始了。     首先介绍host服务器架构。host以oracle数据库作为底层数据存储,以公司总部开发的Santorin作为应用,主要提供给测试台架数据存储、数据访问、数据导入导出、用户权限管理和数据自动备份

kseawolfk的专栏 1035

MySQL varchar长度分配对性能的影响

前言:解决问题的方法没有最优,只有更优! 最近在XXX处看到建表时,看到对varchar长度设计并没有理解很透彻,故总结下。 举例: varchar(32) 和 varchar(64)区别是啥? 首先,varchar 大家都知道是动态长度分配,他们空间开销是一样的。 区别和联系: 对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,也就是上面所说空间开销一样。 但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。就是使用字符类型中定义的长

weixin_42678790的博客 5691

CMMI AIM 人工智能成熟度框架:31个过程域的157项AI实践集成

CMMI AIM人工智能成熟度框架为企业提供了系统化管理AI项目全生命周期的解决方案,包含31个过程域的157项AI实践。该框架通过四个演进阶段(混沌与风险、结构与凝聚、验证与信任、价值与增长),帮助组织建立可持续的AI能力成长路径,降低项目失败率并提升商业价值。

weixin_42613501的博客 355

mysql varchar 缺点_关于mysql:对所有基于文本的字段使用泛型varchar(255)是否有缺点?...

我有一个contacts表,其中包含postcode,first name,last name,town,country,phone number等字段,所有字段都定义为VARCHAR(255),即使没有 这些字段将几乎接近255个字符。 (如果您想知道,是因为Ruby on Rails迁移默认情况下将String字段映射到VARCHAR(255),而我从不费心重写它)。由于VARCHAR仅存储字...

weixin_34342589的博客 633

图像去模糊(二)——Richardson–Lucy算法

Richardson Lucy Algorithm(Richardson-Lucy算法详解及效果实例)

xueruhongchen的博客 3万+

hpm6750evk2开发板(一)菜鸟入门

hpm6750与我们平时常用的stm单片机在开发环境和开发方法上有很大的区别,所以上手还是需要花一点时间的,拿到板子先不要急着上电调试,我们先找资料学习一下了,免得多走冤枉路,以下是我整理的一些学习资源,包括开发板使用手册、芯片SDK、开发工具、视频资料等,建议先把使用手册和学习视频先看了,再取搭建环境测试。最近刚入手一块hpm6750evk2开发板,花了几天时间学习,算是菜鸟入门了,今天分享一下学习过程。看完资料后,把开发工具安装上,下一篇文章我们分享一下调试工程的过程和遇到的问题。

Silas1750的博客 3088

char和varchar的区别、区别的原因以及常用场景举例

一、区别 1、最大长度: char最大长度是255字符,varchar最大长度是65535个字节。 2、定长: char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。 3、空间使用: char会浪费空间,varchar会更加节省空间。 4、查找效率: char查找效率会很高,varchar查找效率会更低。 5、尾部空格: char插入时可省略,vaechar插入时不会省略,查找时省略。 二、char比varchar效率更快的原因 这是由他们在磁盘上存放的不同形式决定的

Mengxinxiaobaia的博客 1万+

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1557

char与varchar类型区别的深度剖析

char和varchar这两种类型是我们经常使用的类型,在使用的时候大家也没有特别注意有什么区别,好奇心驱使我对其进行探究,经过查阅一番资料手册以及做的小测试,有了一定程度的了解,特此记录下来!    手册中有提到:CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。    稍微进一步的解释:

Toby的博客 3万+

STMCubeMX使用TB6612驱动编码轮并进行测速

TB6612电机驱动模块通过IN1和IN2引脚控制电机的旋转方向,并通过PWM信号的占空比调节电机速度。代码示例展示了如何使用GPIO控制电机的正反转,以及如何动态调整PWM占空比实现速度控制。系统设计中,TB6612与编码减速电机连接,STM32CubeMX用于初始化GPIO和PWM输出。编码器接口配置使用TIM3进行测速,TIM4定时器用于速度计算。Keil软件中编写的代码包括编码轮计数值获取、速度计算、电机正反转控制以及小车运动控制等功能。通过OLED显示速度,并实现电机的调试与测试。

wwivn的博客 2262

GEE:面对对象土地利用分类(结合SNIC、GLCM 和机器学习算法)

本文将介绍在Google Earth Engine中结合SNIC、GLCM和机器学习算法的的土地利用/土地覆盖(LULC)分类方法。结果如下图所示,

养乐多的博客 5619

mysql char 和varchar哪种效率高_char、varchar 哪种的搜索效率高

在MySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,mysql就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+...

weixin_31758621的博客 2120

国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。网上现在并没有v2版本的GmSSL可用的命令行文章,本章用于记录这些命令。本文原创自csdn博客,其他网站看到这篇文章都是盗,版,爬。虫。网站,支持原创,远离盗版。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 4606

数据诊断:四维穿透式检查与精准转化缩减方法论

数据诊断是一种面向业务根因的数据质量治理范式,其核心在于超越传统EDA的统计表象,通过结构、语义、分布、关系四维穿透式检查,定位数据病变的解剖位置与病理机制。它融合元数据管理、业务知识图谱与统计过程控制(SPC),实现从技术异常到业务影响的可归因分析。在数据转化环节强调语义升维——将原始字段映射为可驱动决策的业务概念;在数据缩减环节坚守信息熵守恒,构建场景化最小完备特征集。该方法已被金融、制造、电商等行业验证,显著提升模型效果与问题响应效率,是支撑AB测试可信性、报表口径一致性及ML模型稳定上线的关键基础设

weixin_30570101的博客 330

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

char与varchar的区别

char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符  varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符,  从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。所以实际应用中用户可以根据自己的数据类型来做。

Kevin_stu_Info的专栏 1048

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

UUID简介以及主键的选择

使用UUID会为我们生成一组由数字字母以及横杆所组成的随机串,这个随机串由36位,这个随机串一定是全世界唯一的 (1)为什么UUID是全世界唯一的 随机数 时间 硬件自身出场机器编码 (2)在数据库表当中,UUID生成的主键应该使用什么类型 varchar(32):变长 char(32):定长,优化好效率高 ...

qq_56366181的博客 510

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 303

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 528

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 355

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 332

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 564

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 422

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1121

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 231

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 368
上一篇: 什么是BlockingQueue?一次性说清了
下一篇: 全网最详细的 RocketMQ 源码解读方案(上)赶紧收藏
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值