加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么Oracle varchar2具有强制大小作为定义参数?

发布时间:2020-12-12 13:49:11 所属栏目:百科 来源:网络整理
导读:我想知道为什么Oracle需要在VARCHAR2的定义中使用size参数. 我认为这是为了约束.这将是一个更好的选择,oracle将此参数视为可选的NUMBER数据类型? 因为有时一个值大于VARCHAR2列的大小定义,所以我经常会将旧表的大小调整为更大的大小. 定义一个类型的VARCHAR
我想知道为什么Oracle需要在VARCHAR2的定义中使用size参数.

我认为这是为了约束.这将是一个更好的选择,oracle将此参数视为可选的NUMBER数据类型?

因为有时一个值大于VARCHAR2列的大小定义,所以我经常会将旧表的大小调整为更大的大小.

定义一个类型的VARCHAR2(10)或VARCHAR2(1000)是一样的.

我猜,这是一个不必要的限制.如果没有,你知道一个真实的情况,当这个约束导致一些有用的东西吗?为什么没有这样的声明在NUMBER类型?

It’s the same to define a type of
varchar2(10) or varchar2(1000).

不,这根本就不一样.

>列的长度是构建屏幕的开发人员的有用元数据.
>类似的自动查询工具(如TOAD和SQL Developer)在列渲染结果时使用列的长度.
>数据库在为PL / SQL集合分配内存时使用变量的长度.由于内存超出PGA超时变量声明可能导致程序发生故障,因为服务器内存已用尽.
>在PL / SQL程序中声明单个变量有类似的问题,只是这个集合往往会增加问题.
>超大列会引起复合索引的问题.以下是8K块的数据库

….

SQL> create table t23 (col1 varchar2(4000),col2 varchar2(4000))
  2  /

Table created.

SQL> create index t23_i on t23(col1,col2)
  2  /
create index t23_i on t23(col1,col2)
                      *
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded


SQL>

但最重要的是,列大小是一种错误检查的形式.如果该列应该是十个字符长,一些自动进程正在尝试加载一千个字符,那么有些错误.该过程应该失败,所以我们可以调查为什么我们正在加载数据.另一种是一个充满垃圾的数据库,如果这是想要的,我们应该给予每个人Excel并完成它.

事实证明,我们低估的是改变列大小的确是令人厌烦的.但是它并不经常发生,我们可以通过在我们的PL / SQL中使用%TYPE和SUBTYPE声明而不是硬编码变量来缓解很多痛苦.

“why no such declaration in NUMBER type”

数字不同一开始,一个数字的最大大小远小于文本当量(保证精度的38位数).

但是关键的区别在于Oracle存储数值为in scientific notation,因此数字的算术大小与其消耗的存储空间之间没有直接的关系.

SQL> select vsize(123456789012345678901) n1
  2,vsize(999999999999999999999999999999) n2
  3,vsize(0.000000000000000000001) n3
  4,vsize(1000000000000000000000000) n4
  5  from dual
  6  /

        N1         N2         N3         N4
---------- ---------- ---------- ----------
        12         16          2          2

SQL>

然而,尽可能地规定规模和精度仍然是很好的做法,特别是当我们处理整数,说或钱时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读