Oracle:varchar2、nvarchar2 字段类型的区别
一直对varchar2、nvarchar2 字段类型存储字符数不清楚,现测试如下:
创建TT测试表
测试脚本如下:
insert into tt values('1111','1111'); -----ok
insert into tt values('wwww','wwww')-----ok
insert into tt values('应用范围','应用范围');-----失败
提示如下:
insert into tt values('应用范围','应用');-----失败
提示如下:
insert into tt values('应用范围','应w')----ok
附1:
数据库字符集:
附2:
VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容。
VARCHAR在Oracle中不建议使用。
具体到NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:
NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则
1、NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
2、而VARCHAR2(10)的话,则只能存进5个汉字(注:要根据字符集:GBK:2;UTF-8:3),英文则可以存10个。
原文;http://www.cnblogs.com/flyingfish/archive/2010/01/15/1648448.html
附3:
现在版本的Oracle,varchar和varchar2是没有区别的,varchar2和ANSI varchar的区别是varchar2把空串等同于null处理。
这也是为什么ORACLE推荐使用varchar2类型的原因,因为如果新版本Oralce的varchar类型完全兼容ANSI标准时,使用varchar2的脚本可以不修改。
至于一个varchar2字符要用几个字节存储,要看数据库使用的字符集,
比如GBK,汉字就会占两个字节,英文1个,
如果是UTF-8,汉字一般占3个字节,英文还是1个。
而NCHAR、NVARCHAR是以UNICODE-16存储,每个字符固定两个字节。
原文:http://www.blogjava.net/xcp/archive/2009/10/06/oracle1.html
附4:
char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。因为是固定长度,所以速度效率高。
varchar类型:Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
varchar存储变长数据,但存储效率没有CHAR高。如 果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 varchar(10)是最合算的。varchar类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。
nchar类型和Nvarchar类型是怎么一回事呢?为了与其他多种字符的转换,如中文,音标等,对每个英文(ASCII)字符都占用2个字节,对一个 汉字也占用两个字节,所有的字符都占用2个字节。
举个例子:
insert a select '木子a'
----存储长度为5个字节,余下的3个字节全部释放
insert a select '木神易
----存储长度为6个字节,余下的2个字节全部释放
----意思是varchar变长字符数据类型与存储数据的实际长度是一致的
nvarchar(n):可变长度 Unicode 数据,其最大长度为 4,000 字符。
字节的存储大小是所输入字符个数的两倍,
就是说它是双字节来存储数据的。
如果存储数据如果存在单字节时,它也是以双字节来占用存储空间的。
varchar一般适用于英文和数字,nvarchar适用中文和其他字符,其中N表示Unicode常量,可以解决多语言字符集之间的转换问题
原文出处:http://www.cnblogs.com/moss_tan_jun/archive/2010/01/30/1659741.html
附5:
“char比varchar快得多”的说法并不正确。同样“VARCHAR存储变长数据,但存储效率没有CHAR高。”的说法也不正确。
在某些情况下,char比varchar会快一些;某些情况varchar比char快(这种情况可能更多)。事实上,char比varchar快得多的情况几乎没有(除非是极端情况,如错误地使用varchar(1))。
初看起来,由于char是固定长度,它在数据行(row)中的位置(或偏移量)是固定的。因此char字段的获取几乎是直接跳到该位置然后开始读取。而varchar由于长度不固定,varchar字段的获取还需要通过一个间接跳转(类似于lookup table)。但实际上,由于该操作是在内存中进行,除了多几条CPU指令之外,几乎谈不上什么开销。
而通常一个数据页存储的记录数多少更能影响数据库的性能,因为它牵涉到磁盘I/O。假设字段长度为100,而平均字符串数据长度只有50,那么varchar(100)要比char(100)更快。极端情况,如果该表的字段很少,那么varchar会比char快很多。因为同样大小的磁盘读取,采用varchar读取的记录数会接近char的两倍。
对于更新(update)操作的性能,则要取决于填充率(fill factor)和更新的频度。
对于varchar和char的选择,一般性的指导原则是,对于最大长度<=4的字符串,使用char(nchar); 对于最大长度大于20的字符串,使用varchar(nvarchar)。对于4~20之间的字符串,可以根据自己情况定。对于大多数情形,使用varchar会更好。
msolap
Oracle:varchar2、nvarchar2 字段类型的区别的更多相关文章
- ORACLE常用数据库字段类型
ORACLE常用数据库字段类型 常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度 ...
- Mysql,Oracle与Java字段类型映射关系
Mysql,Oracle与Java字段类型映射关系 参考相关博文 MySQL/Oracle字段类型 Java字段类型 最大长度 BIT java.lang.Boolean 1 BLOB java.la ...
- MySQL中TEXT与BLOB字段类型的区别
这篇文章主要介绍了MySQL中TEXT与BLOB字段类型的区别,本文总结了6大区别,需要的朋友可以参考下 在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程 ...
- Oracle怎么修改字段类型
转载:https://www.2cto.com/database/201710/689523.html 有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管 ...
- Oracle/SQL 修改字段类型和长度
标准SQL修改字段类型和长度语句: ALTER TABLE tableName modify column columnName 类型;例如Mysql的修改字段类型语句:alter table tes ...
- oracle如何修改字段类型(oracle总体知识2)
在一次做开发的时候,遇到需要将数据表的字段类型由number改成varchar,可是该字段又有值, 用 alter table t-name modify cname newType;会报错. 话说 ...
- oracle显示转换字段类型cast()函数
今天遇到一个查询类型转换的问题:表的字段是varchar2类型,然后查询到的结果要转换为number(20,2),刚开始的时候使用to_number()函数,发现不能满足需求.后来才知道,原来还有ca ...
- oracle查询表指定字段类型
查询表某字段类型,如下: SELECT data_type FROM all_tab_cols WHERE table_name = UPPER('SRIS_P_BaseInfo') and colu ...
- Oracle varchar2或char类型的byte和char的区别
那其中的BYTE和CHAR有什么区别呢 BYTE,用字节指定:VARCHAR2(10 BYTE).这能支持最多10字节的数据,在一个多字节字符集中,这可能只是两个字符.采用多字节字符集时,字节与字符并 ...
随机推荐
- Mongodb_分片集群模式
前面介绍的副本集模式实现了数据库高可用. 但是还是存在的问题是: 所有的从节点都是从主节点全面拷贝,这样数据量过大时,从节点压力大.还有就是海量数据时存在硬件瓶颈, 毕竟每一个机器的存储量总是有限的. ...
- ftrace简介
ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析. 最早 ftrace 是一个 function tracer,仅能够记录内核的函数调用流程.如今 ft ...
- 测试开发系列之Python开发mock接口(三)
于进入主题了,前面的准备工作都已经做好了,下面就开始写逻辑的代码了,代码我已经写好了,每行都加了注释,不明白的可以留言. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- Java并发编程关键字synchronized的总结
一.对synchronized的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行. ...
- 【gradle】mac上安装gradle
根据gradle官网指导,一步一步安装即可 https://gradle.org/install/ 或者,如果你没有办法墙出去,或者本地使用命令下载gradle比较慢的话,可以采用下面的方式 ==== ...
- 使用Myeclipse + SVN + TaoCode 免费实现项目版本控制的详细教程
通过Myeclipse + SVN插件 + TaoCOde可以省去代码仓库的租建:同时还可以很好的满足小团队之间敏捷开发的需求.接下来详细介绍整个搭建流程. 首先,介绍所用到的工具: 1,Myecli ...
- Mysql 性能优化20个原则(4)
16. 垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段,很恐怖) 示例一:在 ...
- centos安装配置nginx,ssl生产和配置教程
[一]nginx安装nginx安装带ssl扩展: cd /usr/local/src #进入用户目录wget http://nginx.org/download/nginx-1.15.0.tar.gz ...
- LeetCode 3_Longest Substring Without Repeating Characters
LeetCode 3_Longest Substring Without Repeating Characters 题目描写叙述: Given a string, find the length of ...
- [cocos2d-x]怎样降低cocos2d-x游戏的耗电量?
Cocos2d-x游戏的耗电量一直是个让人头疼的问题,一个简单的三消游戏,玩一会手机就热得发烫,更郁闷的是电池消耗非常快.基本上两个小时就能够把电池耗光. 近期又看到一个帖子.有个老外用cocos2d ...