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字节的数据,在一个多字节字符集中,这可能只是两个字符.采用多字节字符集时,字节与字符并 ...
随机推荐
- MVC 上传文件的方法
这两天又开始研究MVC了,期间断断续续已经搞了好久了,可是都没坚持下来.囧!这次一定坚持搞出来一个名堂. 废话少说,直接上代码. 前台引擎采用Razor @model System.Web.HttpP ...
- Kail命令
启动/关闭无线网卡 ifconfig wlan0 up / ifconfig wlan0 down 更改Mac地址: macchanger -A wlan0 启动监听 airmon-ng star ...
- 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例
一.前言 毕业论文答辩结束,闲下来写篇文章.芯片研发人员都在Linux系统下借助各种EDA工具和代码语言完成工作,因此提高代码开发效率,熟练运用开发工具是十分必要的.本文讲述VIM编辑神器的veril ...
- input标签附带提示文字(bootstrap里面输入框的两侧同时添加额外元素)
一直不太喜欢用定位,今天写界面的时候,要在输入框右边添加默认的元素符号. 第一次尝试,因为本身项目用的是bootstrap所以就想利用输入框的两侧同时添加额外元素. 但是写了代码发现效果不同. 第二次 ...
- P1339 热浪Heat Wave 洛谷
https://www.luogu.org/problem/show?pid=1339 题目描述 The good folks in Texas are having a heatwave this ...
- 单片机C51串口发送、接收寄存器
所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否 ...
- mybatis注解@selectKey对于db2数据库的使用
在新增时返回当前新增的主键. 数据库:DB2 用的是mybatis的@selectKey 代码: @InsertProvider(type = Test.class,method="inse ...
- 11.Java web—servlet
继承关系图 一般新新建servlet继承HttpServlet即可 Servlet接口提供了 ServletConfig提供了 HttpServletRequest接口 HttpServletResp ...
- K8S label 操作
在部署完成 node 节点集群之后,为了更灵活的操控 node 节点,有时候需要对 node 节点进行对各个 node 节点进行 lable 标签标记. 查看各个节点的信息 [root@porxy02 ...
- table合并单元格
table合并单元格 新建一张表格.要求表格有四行四列,当中第一行的四列合并,第二行.第三行和第四行的第一列合并 <!DOCTYPE html PUBLIC "-//W3C//DTD ...