通过实战探索数据库中的char、varchar、varchar2、nvarchar2的部分区别

简介: 通过实战探索数据库中的char、varchar、varchar2、nvarchar2的部分区别

前言

注:本文的实践是在oracle数据库中进行的,主要基于字节与字符以及定长与变长方面考虑,探索这四个类型的部分区别

Oracle数据库中,char、varchar、varchar2、nvarchar2是我们常用到的数据类型


(MySQL中没有varchar2和nvarchar2,也可以参考本文来比较MySQL中char和varchar的区别)


下面我们做一个简单的实验吧:


首先创建一个表,里面有aa,bb,cc,dd四个字段,类型分别是char、varchar、varchar2、nvarchar2。如下图所示:


一、变长与定长

我们用下面的SQL语句插入一条数据,所有的字段都是5个字节代表的数字,排除了字符和字节的影响:

[sql]view plaincopy

  1. insertinto test (aa, bb, cc, dd)  
  2. values  
  3. ('01234', '01234', '01234', '01234');  

我们看下下图中的蓝底背景:

aa字段(蓝色部分较长,因为右边有5个空格)

bb字段

cc字段

dd字段


对比上面的4张图中的蓝色部分长度,aa字段的值最长,其他都相同。

我们可以得出下面的结论:

char是固定长度,长度不够的情况下,用空格代替

varchar、varchar2、nvarchar2是可变长度,按照实际的长度存储


二、存储单位

1、默认存储单位

用下面的SQL语句插入一条数据,所有的字段都是10个汉字(因为汉字是字符类型,排除变长与定长的影响)

[sql]view plaincopy

  1. insertinto test (aa, bb, cc, dd)  
  2. values  
  3. ('一二三四五六七八九十', '一二三四五六七八九十', '一二三四五六七八九十', '一二三四五六七八九十');  


出现如下错误,提示最大值是10:

把aa改为一二三四五,其他字段不变,又报错,提示最大值是10:

把bb改为一二三四五,cc、dd字段不变,又出现错误,提示最大值是10

把cc改为一二三四五试一下,插入成功!查询一下:

再用下面的SQL语句插入一条数据,所有的字段都是数字(因为数字是字节类型)


[sql] view plain copy


1.insert into test (aa, bb, cc, dd)  

2.values  

3.('0123456789', '0123456789', '0123456789', '0123456789');  


直接插入了,没有报错!得到下面的结果:

上面的操作可以得出:char、varchar、varchar2默认存储单位是字节,nvarchar2默认存储单位是字符


2、其它存储单位

2.1 char、varchar、varchar2还可以用字符作为单位

既然char、varchar、varchar2默认存储单位是字节,那么这三种类型能不能用字符作为存储单位呢?

用下面的例子来测试,结果是都可以插入:

2.2 nvarchar2不能用字节作为存储单位

char、varchar、varchar2的长度单位可以是byte和char,那么nvarchar2的长度单位能不能是byte呢?

请看下面这个实验:把四个字段都设置成byte类型,则发生报错:

而把前三个设置为byte,最后一个默认呢?下面的实验表示可以成功创建表以及插入数据:


通过上面的操作,我们可以得出以下结果:

char、varchar、varchar2存储长度单位可以是字节,也可以是字符。

nvarchar2存储长度单位是字符!


3 探索过程中的一个问题

创建表时,nvarchar2 类型里不能有长度单位char,否则会报错:

结论

1、长度的区别:

char是固定长度,长度不够的情况下,用空格代替

varchar、varchar2、nvarchar2是可变长度,按照实际的长度存储

2、存储单位的区别:

char(byte), char(char),其中字节是默认单位


varchar(byte), varchar(char),其中字节是默认单位


varchar2(byte), varchar2(char),其中字节是默认单位


nvarchar2()  默认存储单位是char,且括号里不能有单位


3、其他区别

关于其他的区别,有最大存储、存储效率等,这里不做实验,推荐两篇文章作为参考

char和varchar2的比较的问题

oracle数据库中varchar2陷阱

相关文章
|
3月前
|
存储 SQL 运维
速看!数据库与数据仓库的本质区别是什么?
本文深入解析了“数据库”与“数据仓库”的核心区别,涵盖设计目的、数据结构、使用场景、性能优化和数据更新五个维度。数据库主要用于支持实时业务操作,强调事务处理效率;数据仓库则面向企业分析决策,注重海量数据的整合与查询性能。二者在企业中各司其职,缺一不可。
|
4月前
|
存储 关系型数据库 MySQL
MySQL数据库中的 char 与 varchar的区别是什么
MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
394 0
|
10月前
|
SQL
【YashanDB 知识库】通过触发器复制 varchar(4000 char) 列的数据导致乱码
**问题简介:** 客户在使用触发器将表 A 中 varchar(4000 char) 列的数据复制到表 B 时,发现表 B 中的数据出现乱码且与表 A 不一致。此问题影响所有 YashanDB 版本,原因是 YashanDB 在处理触发器场景下的大长度 varchar 数据复制时存在机制错误。为避免该问题,建议将列长度修改为 varchar(2000 char) 或更小。数据正确性无法保证,需谨慎处理。 **验证方法:** 可通过创建表 A 和 B 及相应触发器进行测试。
【YashanDB 知识库】通过触发器复制 varchar(4000 char) 列的数据导致乱码
|
9月前
|
SQL NoSQL Oracle
关系型与非关系型数据库的区别
关系型数据库是依据关系模型来创建的数据库,所谓关系模型就是“一对一”、“一对多”、“对多对”等。常见的关系型数据库有Oracle、MySQL、SQL Server等。非关系型数据库主要基于“非关系型模型”,其中非关系型模型有:列模型、键值对模型、文档类模型。比如redis属于键值对模型。 MongoDB属于文档模型 关系型数据库的优点: ● 易于维护:都是使用表结构,格式一致。 ● 使用方便:SQL语言通用,可用于复杂查询。 ● 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。 关系型数据库的缺点: ● 读写性能比较差,尤其是海量数据的高效率读写。 ● 固定的表结构,灵活
|
9月前
|
SQL 存储 关系型数据库
在PG数据库中,not in 和except的区别
在PG数据库中,not in 和except的区别
|
9月前
|
SQL
【YashanDB知识库】通过触发器复制varchar(4000 char)列的数据导致乱码
【YashanDB知识库】通过触发器复制varchar(4000 char)列的数据导致乱码
|
10月前
|
SQL
【YashanDB 知识库】通过触发器复制 varchar(4000 char) 列的数据导致乱码
**简介:** 某客户在使用触发器将表 A 的 varchar(4000 char) 列数据复制到表 B 时,出现数据乱码且不一致的问题。经分析,YashanDB 在处理触发器场景下的 varchar(4000 char) 列数据复制时存在机制错误,影响所有版本。建议将列长度修改为 varchar(2000 char) 或更小以规避问题。通过特定 SQL 可验证该问题是否存在。
|
SQL 存储 关系型数据库
达梦数据库字段类型 varchar 转 text
本文介绍了在达梦数据库中将字段类型从 `varchar` 转换为 `text` 的两种方法:一是通过 DM数据迁移工具导出表结构和数据,修改后重新导入;二是通过添加临时字段、转移数据、删除原字段并重命名临时字段的方式实现转换。针对不同数据量的表,提供了灵活的解决方案。
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
161 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

热门文章

最新文章