转自:http://www.cnblogs.com/iyangyuan/p/3491215.html

oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型。

对应该类型,在oracle中有三种比较常用的类型:varchar2(byte)、varchar2(char)、nvarchar2()。

那么这三种类型到底有什么区别呢?

首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都是4000

varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该字段最多能容纳100个字节,强调空间大小。由于我们描述的是字节,因此,保存汉字等字符时,就要小心了。如果你的数据库用的是GBK编码,那么一个汉字将占用2个字节,最多能存50个汉字,如果你的数据库用的是UTF8编码,那么一个汉字将占用3个字节,最多能存33个汉字。

varchar2(char):表示最大字符数是100,该字段最多能容纳100个字符,强调个数。假设我们写成varchar2(100 char),那么无论是数字、字母、汉字,都看成一个字符,最多写100个,当然,汉字越多,占用的空间越大,同样遵循上边的数据库编码原则。例如:存入一个汉字,底层占2或3个字节,存入一个字母,占1个字节,绝对不是某些文章所说1个字母或数字也占2或3个字节!

nvarchar2():没有byte、char之分,类似于varchar2(char),只不过nvarchar2()屏蔽了数据库编码,无论是何种编码,nvarchar2()中一个汉字都占两个字节。

一般的教程,也就到这了,可是如果再多一步思考,会发现一个致命问题。

实际应用中,很可能会出现这种写法:varchar2(1400 char),我们主观的认为,这个字段最长不能超过1400个字符,这意味着我们可能会存入1399个字符,貌似很正确的样子。

但是,如果这1399个字符都是汉字,字符长度并没有超过1400,看起来一切正常,但实际上我们损失了一部分数据,为什么?

因为1399个汉字,按UTF8编码来说(99%的项目都是UTF8编码吧。。),需要占用1399*3=4197个字节,而文章开篇就说,无论是什么char,最大长度就是4000字节,一个也不能多,因此多出来的197个字节,都会抹去,而整个过程中,无任何错误提示,你的数据就这样蒸发了!

所以,对于GBK编码的数据库而言,安全的写法为:varchar2(2000 char)、nvarchar2(2000),对于UTF8编码的数据库而言,安全的写法为:varchar2(1333 char)、nvarchar2(2000)。

各位读者,赶快检查一下你的数据库吧!

小菜水平有限,高手勿喷,欢迎与我交流~~~

转载于:https://www.cnblogs.com/bj20170624/p/8492207.html

【转】oracle数据库中varchar2陷阱相关推荐

  1. oracle tovarchar2_oracle数据库中varchar2陷阱

    https://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html 对应该类型,在oracle中有三种比较常用的类型:varchar2( ...

  2. oracle数据库中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥区别?

    VARCHAR2(50 char)这种类型的字段最多放50个字符,不够50个用空格填充:而VARCHAR2(50)最大允许存放50个字符,但是不足50个也不用空格填充.varchar2是变长字符串,与 ...

  3. oracle nvarchar2问题,Oracle数据库中,使用case语句,遇到VARCHAR2与NVARCHAR2问题

    问题: 在有sqlserver数据库迁移至Oracle数据库时,遇到将VARCHAR2付给NVARCHAR2问题 原sql CASE A .kindCode WHEN '2321034' THEN'0 ...

  4. 一起ORACLE数据库中数据查询结果不一致问题的排查过程

    一.问题描述 在某软件开发项目中,需要在ORACLE数据库中建立十张类型相同的员工信息表tb_employeeinfo0~tb_employeeinfo9,并建立向这十张表中插入数据的存储过程.ORA ...

  5. oracle查询记录插入,我应该使用哪种查询语法在Oracle数据库中插入记录?

    我是一个初学者,试图用C#创建一个简单的程序来插入和更新Oracle数据库中的记录.我已经成功地连接到数据库,但是我的SQL语句出现异常,该异常指出不支持(?)符号.为什么会出现此异常,该如何解决? ...

  6. JDBC查询Oracle全部表名称,如何使用JDBC API从Oracle数据库中的现有表中检索记录?...

    您可以使用UPDATE查询来更新/修改表中记录的现有内容.使用此功能,您可以更新表的所有记录或特定记录. 语法UPDATE table_name SET column1 = value1, colum ...

  7. jdbc oracle 删除数据库连接,如何使用JDBC API从Oracle数据库中删除表?

    您可以使用INSERT查询将记录插入表中. 语法INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) VALUES (value1 ...

  8. oracle blob update,Oracle数据库中对BLOB数据的操作问题

    [TechTarget中国原创]问:请问在Oracle数据库中,如何插入并检索二进制大对象数据(BLOB)? 答:我建议在处理大对象数据之前,先阅读一下"Oracle应用开发者指南" ...

  9. oracle数据库插入多表,在Oracle数据库中插入嵌套表

    我是PL/SQL数据库的新学习者,这是一种给apex.oracle.com上的数据库应用指定序列的练习.然后我创建了表格,但是当填充与插入的代码如下所示,应用赋予错误,表你不介意,我需要你的帮助在Or ...

最新文章

  1. Linux(CentOS 7_x64位)系统下安装RDkit(修正)
  2. 《人月神话》阅读笔记2
  3. Excel单因素方差分析
  4. CoreAnimation编程指南(一)概念
  5. 服务器通过响应头向浏览器设置cookie,http响应包括设置cookie jession id,但随后发送请求,请求标头中没有cookie信息...
  6. php ==gt;,谈谈PHP中的 -gt;、=gt; 和 :: 符号 - 易采站长站
  7. 排序算法之——冒泡排序分析
  8. 微信公众号查后端服务器IP,微信公众号平台接口开发 获取微信服务器IP地址方法解析...
  9. 【C++】教大家在七夕new一个对象
  10. Hibernate JPA 效率低下的原因
  11. vss服务器状态失败_vss问题解决办法
  12. python数据分析热力图怎么看_数据分析实战—热力图
  13. centos 设置为北京时间
  14. 全国大学生“高教杯“成图大赛:关于齿轮的快速建模研究
  15. 【网络安全常用术语解读】CPE详解
  16. 接口文档规范有哪些?
  17. 小心!除了植入木马,你的充电宝可能还在窃听你,受害人遍布全国
  18. 报错Unknown custom element: <组件名> - did you register the component correctly?的原因及解决办法
  19. 计算机毕业设计之java+springboot基于vue的人事管理系统-员工管理系统
  20. 风扇,html css3,纯CSS3实现的3D风扇动画

热门文章

  1. cocoapods-安装
  2. 工作记录二-Docker+Dockerfile
  3. sql server 日期类型
  4. 基于SuperSocket的IIS主动推送消息给android客户端
  5. Python--day48--ORM框架SQLAlchemy操作表
  6. redis 主从复制 [转]
  7. FLEX组件AnyChart实例教程.
  8. 真格量化-50ETF期权波动率策略
  9. Java-Type简单分类
  10. 网络爬虫--2.HTTP和HTTPS