前言
Oracle 数据库中, charvarcharvarchar2nvarchar2 是我们常用到的数据类型 (注: MySQL 中没有 varchar2 和 nvarchar2, 也可以参考本文来比较 MySQL 中 char 和 varchar 的区别)
很多人搞不懂他们的区别, 在网上搜的话, 很多人都是口头叙述, 其真实性值得我们怀疑!
下面我们做一个简单的实验, 探索他们的区别吧:
首先创建一个表, 里面有 aa,bb,cc,dd 四个字段, 类型分别是 charvarcharvarchar2nvarchar2 如下图所示:
一变长与定长
我们用下面的 SQL 语句插入一条数据, 所有的字段都是 5 个字节代表的数字, 排除了字符和字节的影响:
- insert into test (aa, bb, cc, dd)
- values
- ('01234', '01234', '01234', '01234');
我们看下下图中的蓝底背景:
aa 字段 (蓝色部分较长, 因为右边有 5 个空格):
bb 字段
cc 字段
dd 字段
对比上面的 4 张图中的蓝色部分长度, aa 字段的值最长, 其他都相同
我们可以得出下面的结论:
char 是固定长度, 长度不够的情况下, 用空格代替
varcharvarchar2nvarchar2 是可变长度, 按照实际的长度存储
二字节与字符
我们再用下面的 SQL 语句插入一条数据, 所有的字段都是 10 个汉字 (因为汉字是字符类型, 排除变长与定长的影响)
- insert into test (aa, bb, cc, dd)
- values
- ('一二三四五六七八九十', '一二三四五六七八九十', '一二三四五六七八九十', '一二三四五六七八九十');
出现如下错误, 提示最大值是 10:
我们把 aa 改为一二三四五, 其他字段不变, 又报错, 提示最大值是 10:
我们把 bb 改为一二三四五, ccdd 字段不变, 又出现错误, 提示最大值是 10
我们把 cc 改为一二三四五试一下, 插入成功! 查询一下:
我们再用下面的 SQL 语句插入一条数据, 所有的字段都是数字 (因为数字是字节类型)
- insert into test (aa, bb, cc, dd)
- values
- ('0123456789', '0123456789', '0123456789', '0123456789');
没有报错, 得到下面的结果:
varchar 还可以存储字符类型
varchar 还可以有字符长度, 用下面的例子来测试:
通过上面的操作, 我们可以得出以下结论:
charvarcharvarchar2 存储长度单位的是字节, nvarchar2 存储长度单位是字符!
即 char(byte)
- varchar(byte), varchar(char),
- varchar2(byte)
- nvarchar2(char)
结论
区别一
char 是固定长度, 长度不够的情况下, 用空格代替
varcharvarchar2nvarchar2 是可变长度, 按照实际的长度存储
区别二
charvarchar2 存储长度单位的是字节;
varchar 可以存储字节, 也可以存储字符, 默认是字节;
nvarchar2 存储长度单位是字符!
即 char(byte)
varchar(byte), varchar(char), 其中字节是默认类型
- varchar2(byte)
- nvarchar2(char)
来源: http://blog.csdn.net/qq_26230421/article/details/79568815