oracle数据库中varchar2陷阱
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)。
各位读者,赶快检查一下你的数据库吧!
小菜水平有限,高手勿喷,欢迎与我交流~~~
相关文章
- CentOS7 Mini安装Oracle后用PL/SQL连接数据库(图形化安装)
- Java连接oracle数据库的两种常用方法
- 使用以下代码可以插入BLOB类型的图片或pdf文档到Oracle数据库中:
- Oracle云存储“超售”导致服务能力无法兑现?
- [置顶] 如何使用c3p0+spring连接oracle数据库
- Oracle 11g从入门到精通(第2版)
- [数据库]Oracle数据迁移至HIVE(待续)
- oracle数据库执行sql语句报错(ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired)
- oracle使用并行踩过的坑
- Oracle(限定查询2)
- Windows Server 2003 R2(32位)安装oracle(32位)步骤
- oracle分页查询原理浅析
- Python中通过cx_Oracle访问数据库遇到的问题总结
- 查询oracle数据库的数据库名、实例名、ORACLE_SID
- Oracle数据库——SQL高级查询
- oracle线程数更改
- Dapper Oracle数据库 插入(INSERT)数据时参数指定为null的方法
- 将oracle11安装到虚拟机并在本机进行远程操控oracle数据库(超详细步骤另附资源)
- 获取Oracle数据库中字段信息
- oracle显示数据库名和表名
- oracle什么时候需要commit
- 探索ORACLE之ASM03_应用