文档章节

oracle数据库中varchar2陷阱

夜黑人模糊灬
 夜黑人模糊灬
发布于 2017/08/29 11:48
字数 689
阅读 13
收藏 0

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

本文转载自:http://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html

共有 人打赏支持
夜黑人模糊灬
粉丝 7
博文 69
码字总数 45164
作品 0
程序员
Oracle之数据字典

数据字典 数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息 数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者是sys用户 用户只能在数据字...

落轩易离落
2016/09/26
0
0
说说在 Oracle 中如何实现 MD5 加密

Oracle 在 DBMSOBFUSCATIONTOOLKIT 包中提供了 MD5 加密函数,它的定义如下: RAW,类似于 CHAR,声明方式为 RAW(L), L 为长度,以字节为单位,作为数据库列最大 2000 字节,作为变量最大 ...

deniro
05/17
0
0
Oracle查询数据表结构/字段/类型/大小

Oracle数据库字典 在Oracle的绝大多数数据字典视图中都有象DBATABLES,ALLTABLES和USERTABLES这样的视图家族。Oracle中有超过100个视图家族,下表列出了最重要和最常用的视图家族,需要注意的...

yousss
05/10
0
0
Oracle表空间、段·区·块

在Oracle学习过程中,存储结构,表段区块可能是每个初学者都要涉及到的概念。表空间、段、分区和数据块分别表示了Oracle进行数据存储的不同层次和结构。了解清楚这几个结构,有助于我们奠定一...

0o清风徐来o0
2012/10/17
0
0
oracle数据类型之number/char浅析

NUMBER: number:38位;number(p,s):p:精度,s:刻度(小数位数),在Oracle数据库中,number数据类型代表int,double,float等数字类型数据 举例: 1234.567 number(6,2) --------> 1234.57...

李东委
2014/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
1
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部