Oracle 在PL/SQL中将varchar2变量声明为最大长度的任何缺点

Oracle 在PL/SQL中将varchar2变量声明为最大长度的任何缺点,oracle,plsql,Oracle,Plsql,在PL/SQL中,如果我们使用varchar2(100)创建一个变量name,然后将长度为50的值分配给该变量,则使用的总内存为100个字符 但是,如果您将其声明为varchar2[4000]或更多,它将只使用50字符 varchar列是否总是只分配您分配的内容 此外,如果是这种情况,将所有varchar2变量声明为最大长度是否是一种良好的做法,因为内存将被动态分配?请澄清。谢谢你你错了。varchar2(100)比原始数据多使用一个字节,将长度存储为无符号字节) 对于超过255的最大长度,将使

在PL/SQL中,如果我们使用
varchar2(100)
创建一个变量
name
,然后将长度为
50
的值分配给该变量,则使用的总内存为
100
个字符

但是,如果您将其声明为
varchar2[4000]
或更多,它将只使用
50
字符

varchar
列是否总是只分配您分配的内容


此外,如果是这种情况,将所有
varchar2
变量声明为最大长度是否是一种良好的做法,因为内存将被动态分配?请澄清。谢谢你

你错了。varchar2(100)比原始数据多使用一个字节,将长度存储为无符号字节)

对于超过255的最大长度,将使用比原始数据多出的2个字节,将长度存储为无符号16位(2字节)整数

所以是的,有一个小的处罚

  • 如果值(大部分)长度相同(无额外字节),则使用固定宽度字符(n)
  • 使用varchar(n),如果所有值都合适,则n<256(1个额外字节)
  • 否则使用varchar(4000)(2个额外字节)

我不担心字节,只要使用方便的方法就行。

我想如果我们使用内存之外的盲大小,数据完整性将是一个问题。如果我们不知道存储的是什么,如何确定数据大小。如果该值超过4000大关怎么办

此外,我在使用varchar2(4000)在组合列上创建索引时遇到了问题。 你会得到这样的东西 错误报告: SQL错误:ORA-01450:超过最大密钥长度(6398) 145000000-“超过最大密钥长度(%s)” *原因:
*行动:

也许这会对你有所帮助,这篇文章让我很困惑。如果变量的大小声明为1到3999(11g+)/1999(10g或更早),则将为最大长度分配内存(即VARCHAR2(100)将需要至少100字节的内存)。如果声明变量的大小为4000(11g+)/2000(10g或更早)或更大,则将根据存储的数据大小分配内存。那么,当内存在声明为maxlength时被动态分配时,为什么要用较小的长度声明呢?如果我创建如下变量,那么对内存分配会有任何影响:entity varchar2(4000):=null;实体_v varchar2(4000):=null;r_id varchar2(4000):=null;i_cnt varchar2(4000):=null@prat negligibleORA-01450实际上与您的
db\u block\u大小
有关。您需要创建一个具有较大
db\u block\u大小的数据库,或者创建一个较小的索引键。@Gerry-我可以选择第二个选项,因为我可以访问程序,但不能更改db\u block\u大小(无DBA访问权).一个较小的索引键可能会更好。同意随时都可以。但是这种架构非常陈旧,情况需要这样一种架构。