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

article/2025/9/30 22:46:56

前言

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

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

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

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

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

 

一、变长与定长

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

[sql] view plain copy

  1. insert into 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 plain copy

  1. insert into 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陷阱

 

更多内容,请关注公众号:程序员高手之路

在公众号回复:Oracle资源   即可免费获取Oracle视频教程!


http://chatgpt.dhexx.cn/article/Ivgyjl5Z.shtml

相关文章

nvarchar 和varchar区别

有时候设计字段的时候,碰到nvarchar和varchar时候,是有点犹豫。所以今天就来探个究竟把。 (一) varchar是非Unicode可变长度类型,nvarchar是Unicode编码可变长度类型 DECLARE name AS VARCHAR(50)我是中国人test SELECT name AS Name, DATAL…

oracle NVARCHAR2 数据类型

参考地址 https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch7progrunicode.htm#sthref807 英语不好的看中文直译 utf8可能会影响性能,因为它是一个可变宽度字符集。NChar字段的空白填充过多会降低性能。考虑使用nvarchar数据类型或更改为nchar数据类型的a…

【ORACLE】谈一谈NVARCHAR2、NCHAR、NCLOB等数据类型和国家字符集

一、背景 一直以来,很多用过ORACLE数据库的开发人员,都知道在ORACLE中,字符类型可以为varchar2,也可以为nvarchar2,但是很多人都不知道这两种类型有什么区别,同样还有char/nchar,clob/nclob这些&#xff0…

Oracle NCHAR与NVARCHAR2 最大字符数和最大字节数

根据官方文档和实验测试整理一下常见问题以及相关结论,以NVARCHAR2为主。 一、 含义及用途 NCHAR和NVARCHAR2都是Unicode数据类型,存储Unicode字符数据。NCHAR和NVARCHAR2数据类型的对应的国家字符集(NLS_NCHAR_CHARACTERSET)只能…

foreach 中如何给数组赋值

最近发现,在foreach中给数组赋值,在foreach外,数组是没有变化的,对此情况,有特定的处理方法,特此记录一下: 如下,就是在foreach中,加上 $res[$k] $v;给$res重新赋值&am…

数组与数组赋值

int类型数组赋值 #include<stdio.h> int main() { int a[] {1,2,3,4,5,7}; printf("a[3]%d", a[3]); return 0; } char类型数组赋值 1.直接字符串赋值 char a[] "q,0/d"; 2.逐个赋值 char b[] { d,b,3,&am…

VBA 不能给数组赋值,其实只是不能给静态数组整体赋值

1 问题&#xff1a;VBA报错&#xff1a;不能给数组赋值&#xff01; 其实并不是 所有数组不能赋值其实是不能给静态数组&#xff0c;整体赋值&#xff01;只是因为当前处理的是一个静态数组 2 什么是静态数组 &#xff08;只是大小静态&#xff01;&#xff01; 赋值可变&…

天呐!java从键盘给数组赋值

开头 该文档在Github上收获5K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等内容非常丰富…

php数组赋值方式,php数组赋值方式

推荐操作系统&#xff1a;windows7系统、PHP5.6、DELL G3电脑 1、两种赋值 (1)传值赋值 在PHP中&#xff0c;传递赋值是默认的传递方式。如果某个变量的值被赋予了另一个变量&#xff0c;那么改变其中一个的值对其他变量没有影响。 (2)引用赋值 引用赋值意味着新变量简单地引用…

在java中给数组赋值,java中给数组赋值的方法

1、数组操作中&#xff0c;可以使用等于()赋值 注意&#xff1a;此时新数组只是指向原数组的存储空间&#xff0c;并没有重新申请新的空间。 实例&#xff1a;public class ArrayTest{ public static void main(String args[]){ // 1 int[] anew int[4]; a[0]1; a[1]2; a[2]3; …

SSDP 服务发现协议

https://blog.csdn.net/braddoris/article/details/41479171 SSDP在Android上的实现 https://blog.csdn.net/iblade/article/details/81948805

【SSDP 协议介绍】

SSDP&#xff0c;即简单服务发现协议&#xff08;SSDP&#xff0c;Simple Service Discovery Protocol&#xff09;&#xff0c;是一种应用层协议&#xff0c;是构成通用即插即用(UPnP)技术的核心协议之一。 实现 简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。 按照协…

RSTP和MSTP协议的原理

一.RSTP 1.RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;是STP协议的优化版&#xff0c;协议为802.1w。 2.RSTP具备STP的所有功能 3.RSTP可以实现快速收敛 在某些情况下&#xff0c;端口进入转发状态的延时大大缩短&#xff0c;从而…

简单服务发现协议SSDP【转】

来自&#xff1a;https://blog.csdn.net/wuruixn/article/details/23843877 SSDP:Simple Sever Discovery Protocol,简单服务发现协议是一种应用层协议&#xff08;常用于寻找upnp设备&#xff09;&#xff0c;此协议为网络客户提供一种无需任何配置、管理和维护网络设备服务的…

SIP协议-05 SDP协议

文章目录 1 SDP简介2 SDP协议格式2.1 字段描述2.1.1 Version&#xff08;必选&#xff09;2.1.2 origion&#xff08;必选&#xff09;2.1.3 Session Name&#xff08;必选&#xff09;2.1.4 Connection Data&#xff08;可选&#xff09;2.1.5 Bandwidth&#xff08;可选&…

SDP协议总结

一、基本要求 1、SDP的表示 SDP(Session Description Portocol)会话描述协议&#xff0c;通常通过内容类型为"application/sdp"的MIME来表示。 2、媒体和传送信息 SDP可包括以下媒体信息&#xff1a; 媒体类型&#xff08;音频、视频等&#xff09;&#xff1b;…

简单服务发现协议SSDP

SSDP:Simple Sever Discovery Protocol,简单服务发现协议是一种应用层协议&#xff08;常用于寻找upnp设备&#xff09;&#xff0c;此协议为网络客户提供一种无需任何配置、管理和维护网络设备服务的机制。此协议采用基于通知和发现路由的多播发现方式实现。协议客户端在保留的…

协议--SIP/SDP

参考资料 会话初始协议SIP与SDP简介完整SIP/SDP媒体协商概论-SIP/WebRTC概要 1. 什么是SIP 1.1 关于SIP通话的一个形象比喻 生活中&#xff0c;我们想要找一个人互相聊天&#xff0c;首先你到找到这个人、你的声音得传递到对方&#xff0c;对方能听到你的声音&#xff0c; …

SSDP 简单服务发现协议 .

http://blog.csdn.net/lilypp/article/details/6631951 cache network 网络 algorithm ext service SSDP 简单服务发现协议&#xff0c;是应用层协议&#xff0c;是构成UPnP&#xff08;通用即插即用&#xff09;技术的核心协议之一。它为网络客户端&#xff08;network client…

SSDP Protocol

SSDP 简单服务发现协议&#xff0c;是应用层协议&#xff0c;是构成UPnP&#xff08;通用即插即用&#xff09;技术的核心协议之一。它为网络客户端&#xff08;network client&#xff09;提供了一种发现网络服务&#xff08;network services&#xff09;的机制&#xff0c;采…