oracle数据库中varchar2陷阱
来源:互联网 发布:冰川网络下最火的游戏 编辑:程序博客网 时间:2024/05/22 07:41
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)。
各位读者,赶快检查一下你的数据库吧!
小菜水平有限,高手勿喷,欢迎与我交流~~~
文章转载于:http://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html
- oracle数据库中varchar2陷阱
- oracle数据库中varchar2陷阱
- oracle数据库中varchar2陷阱
- oracle数据库中varchar2陷阱
- 【转】oracle数据库中varchar2陷阱
- Oracle数据库中的varchar2类型陷阱
- oracle 数据库中讨论char ,varchar ,varchar2 数据类型!
- oracle数据库中数据类型varchar和varchar2的区别
- Oracle数据库中char,varchar2,nvarchar2的区别
- oracle数据库varchar2()数据类型排序
- Oracle中varchar与varchar2
- Oracle中varchar2(20)和varchar2(20 byte)区别
- oracle数据库blob类型转换为varchar2
- Oracle数据库中char(),varchar2(),nvarchar2()三种数据类型的区别
- oracle数据库varchar2大字段中的换行、空格如何在jsp页面中展示
- 数据库中<>的陷阱
- oracle----varchar2
- oracle中char和varchar2的区别
- 洛谷 P1892 团伙
- mysql 二 数据类型与操作数据表
- Android图片加载框架Glide用法
- 使用USB3.0的U盘装Win7教程
- 三层交换机--访问本地VLANIF接口所需要的L3表项
- oracle数据库中varchar2陷阱
- Android开发 之 Activity全透明渐变切换
- Ubuntu14.04 ROS(indigo) 激光雷达(Sick LMS511) 数据读取
- CUDA编程(八)树状加法
- AS初来乍到Kotlin的配置
- android项目结构设计参考
- B-树、B+树、B*树的区别
- Codeforces 825 A Binary Protocol
- 性能分析神器VisualVM