通过实战探索数据库中的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陷阱

相关文章
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
140 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
29天前
|
SQL 安全 网络安全
Web应用防火墙(WAF)与数据库应用防火墙有什么区别?
Web应用防火墙(WAF)专注于Web应用系统和网站的应用层防护,可有效应对OWASP Top 10等常见攻击,防止SQL注入、CC攻击等。而数据库应用防火墙则位于应用服务器与数据库之间,提供数据库访问控制、攻击阻断、虚拟补丁等高级防护功能,直接保护数据库免受攻击。两者分别针对Web层和数据库层提供不同的安全保护。
40 4
|
1月前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
48 4
|
2月前
|
SQL NoSQL 数据库
Cassandra数据库与Cql实战笔记
Cassandra数据库与Cql实战笔记
33 1
Cassandra数据库与Cql实战笔记
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
257 1
|
2月前
|
存储 SQL JSON
介绍一下RDBMS和NoSQL数据库之间的区别
【10月更文挑战第21天】介绍一下RDBMS和NoSQL数据库之间的区别
116 2
|
1月前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
24 0
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
111 0
|
2月前
|
SQL 关系型数据库 MySQL
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
|
2月前
|
SQL 数据处理 数据库
SQL语句优化与查询结果优化:提升数据库性能的实战技巧
在数据库管理和应用中,SQL语句的编写和查询结果的优化是提升数据库性能的关键环节