https://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html

对应该类型,在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)。

oracle tovarchar2_oracle数据库中varchar2陷阱相关推荐

  1. 【转】oracle数据库中varchar2陷阱

    转自:http://www.cnblogs.com/iyangyuan/p/3491215.html oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型. 对应该类型,在 ...

  2. oracle 删除表存过,oracle删除数据库中已存在表的实例代码

    摘要 腾兴网为您分享:oracle删除数据库中已存在表的实例代码,长沙银行,银万财富,图钉,听中国等软件知识,以及土豆app,局域网文件,宝宝学动物,观海听涛bbs,育碧,生男生女预测大师,新先视,信 ...

  3. oracle有硬件吗,Oracle 10G数据库中软硬件环境有哪些要求?

    以下的文章是介绍Oracle 10G数据库中的相关软硬件环境的要求的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以对以下的文章点击观看了.希望会给你带来一些帮助在此方面. 1.检查硬件要求 系 ...

  4. 三步搞定oracle 11G 导出的pmd文件,导入oracle 12C数据库中

    将oracle 11G 导出的pmd文件,导入oracle 12C数据库中,将面临数据库用户名不匹配问题,12C用户名必须前缀c##,而导出的pmd文件又带原始11G数据库的用户名,无法在12C中建不 ...

  5. Oracle查询数据库中所有的表名称

    1.查询数据库中所有的表名称和每张表所对应的数据条数 select t.table_name,t.num_rows from user_tables t; 此处需要注意的是:在查询每张表所对应的数据条 ...

  6. Oracle清空数据库中数据表数据的方法

    一.简介 最近在项目发版测试的时候,导出dmp的时候不小心把开发库中的一些脏数据导出来了,测试那边导入进去之后一堆不规范的数据,为了不影响测试结果,于是总结了一个快速清空数据库数据表所有数据的方法. ...

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

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

  8. Oracle将数据库中的表数据导入到另一个数据库中

    因为工作需要,把Oracle数据库1中的表数据导入到相同数据结构的数据库2表中,下面将数据库1简称为DB1,数据库2简称为DB2,刚开始的时候我只是简单的将DB1的表数据导出成sql脚本,然后导入到D ...

  9. 在window7 64位下Oracle 10g 数据库中PLSQL Developer配置和使用

    window764位下我看了一些资料并亲自试过,汇总了如下的方法,希望能解决大家的问题. 工具:已经装好的64位Oracle数据库 window7_64位的操作系统 PLSQL_Developer9. ...

最新文章

  1. 英伟达 400 亿美元收购 ARM 受阻,不妨考虑 VMware?
  2. POI处理Excel中的日期数据类型
  3. SPOJ- QTREE+HDU 3966(树链剖分裸题
  4. firefox是什么浏览器_Selenium Firefox驱动程序:使用Firefox浏览器自动进行测试
  5. 002 html总结
  6. linux是否安装java环境,linux是否安装java环境
  7. 软件测试——软件开发过程
  8. 5脚耳机插座原理图_手机原理图的解读
  9. 2. COM编程——什么是接口
  10. 数据库的海量数据的存储解析
  11. 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
  12. c语言约分最简分式原理,算法基础:约分最简分式
  13. 第九届蓝桥杯国赛 调手表
  14. 用easyx图形库做一个简单的c++小游戏---贪吃蛇
  15. 计算机拓展训练论文,素质拓展训练论文拓展训练论文
  16. opencv项目实践一(答题卡识别)
  17. 404, NOT_FOUND - no queue 'rep_queue' in vhost '/'
  18. 我的世界java地狱更新_【我的世界】我得世界:1.16地狱大年夜更新_玩得好游戏攻略...
  19. CISP证书对个人求职有帮助吗?
  20. C语言实现函数确定最大最小值

热门文章

  1. Set无序集合 HashSet 的对象元素唯一性
  2. js 数字序号 转 字母序号
  3. windows 上的应用性能测试
  4. rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递
  5. es6中数组的解构_ES6中的数组解构简介
  6. gradle kotlin_我对Gradle Kotlin DSL的第一印象
  7. maven summer_我在Google Summer of Code的经历
  8. 小程序 redux_Redux应用程序最重要的ESLint规则
  9. python中pyecharts_小白学Python(8)——pyecharts 入门
  10. Python高级——mini_web框架(实现web框架接口,数据库连接)