文档章节

oracle数据库中varchar2陷阱

夜黑人模糊灬
 夜黑人模糊灬
发布于 2017/08/29 11:48
字数 689
阅读 13
收藏 0
点赞 0
评论 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的限制了

© 著作权归作者所有

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

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

落轩易离落 ⋅ 2016/09/26 ⋅ 0

说说在 Oracle 中如何实现 MD5 加密

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

deniro ⋅ 05/17 ⋅ 0

oracle的函数

函数语法: create or replace function functionname(argu1 datatype,argu2 datatype...) return datatype is|as PL/SQL Block; 自定义函数调用限制 1、SQL语句中只能调用存储函数(服务器端...

浮云飘飘 ⋅ 2014/04/24 ⋅ 0

Oracle查询数据表结构/字段/类型/大小

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

yousss ⋅ 05/10 ⋅ 0

Oracle表空间、段·区·块

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

0o清风徐来o0 ⋅ 2012/10/17 ⋅ 0

oracle之Flash Recovery Area全面介绍

设置闪回恢复区 闪回恢复区主要通过3个初始化参数来设置和管理 dbrecoveryfiledest:指定闪回恢复区的位置 dbrecoveryfiledest_size:指定闪回恢复区的可用空间大小 dbflashbackretentionta...

SANSOM ⋅ 2013/12/10 ⋅ 0

Oracle 10g 常用数据类型

数据类型 取值范围 描述 备注 Char(n) n=1 to 2000字节 存储固定长度的字符串。默认长度为1。 Varchar2(n) 高亮为常用字段 n=1 to 4000字节 可变长的字符串,具体定义时指明最大长度n,这种数...

mj4738 ⋅ 2011/11/28 ⋅ 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

oracle常用数据类型

在Oracle数据库中,每个关系表都由许多列组成。给每一列指派特定的数据类型来定义将在这个列中存储得数据类型。 1、CHAR 最多可以以固定长度的格式存储2000个字符或字节。默认指定为以字符形...

jeffsui ⋅ 2013/04/03 ⋅ 0

在命令行下进行Oracle用户解锁

在DBA的日常工作中,经常遇到为Oracle用户解锁的操作;这篇文章给出在命令行下进行Oracle用户解锁的操作方法,通过几条简单的解锁语句就能完成此项工作。下面是具体的过程: 默认的scott用户...

李永china ⋅ 2016/10/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部