oracle数据库中varchar2陷阱

在oracle中有三种比较经常使用的类型:varchar2(byte)、varchar2(char)、nvarchar2()。数据库

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

         首先,咱们要时刻记清:不管是varchar2仍是nvarchar2,最大字节数都是4000oracle

         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 12c的varchar2也没有4000的限制了

相关文章
相关标签/搜索