当值不超过 10 字节时,用VARCHAR2(1000)
而不是在 Oracle中定义列有什么影响?VARCHAR2(10)
该列是否只占用存储值真正需要的空间,还是会对表空间/索引的大小/性能产生任何负面影响?
答案取决于您是在谈论数据库表中的列,还是 PL/SQL 程序中的变量。
数据库列
使用的存储量与存储的数据大小成正比。
PL/SQL 变量
如果变量声明的大小为 1 到 4000 (11g+) / 1999(10g 或更早),则将分配最大长度的内存(即 VARCHAR2(100) 将需要至少 100 字节的内存)。
如果变量声明的大小为 4001 (11g+) / 2000 (10g 或更早) 或更大,则将根据存储的数据大小分配内存。(一个有趣的问题是,如果变量的值发生了变化,内存是如何调整大小的——它会重新分配另一个具有新大小的缓冲区吗?)
10g 参考:PL/SQL 数据类型
小的 VARCHAR2 变量针对性能进行了优化,较大的变量针对有效的内存使用进行了优化。截止点是 2000 字节。对于 2000 字节或更长的 VARCHAR2,PL/SQL 仅动态分配足够的内存来保存实际值。对于小于 2000 字节的 VARCHAR2 变量,PL/SQL 会预先分配变量的完整声明长度。例如,如果将相同的 500 字节值分配给 VARCHAR2(2000 BYTE) 变量和 VARCHAR2(1999 BYTE) 变量,则前者占用 500 字节,后者占用 1999 字节。
11g 参考:避免 PL/SQL 代码中的内存开销
为 VARCHAR2 变量指定超过 4000 个字符的大小;PL/SQL 一直等到您分配变量,然后只分配所需的存储空间
在数据库中,没有区别。VARCHAR2
以可变长度存储,声明的长度只是一个限制。
但是,某些客户端应用程序将保留1000
每列的字节,而不是10
如果他们看到该列被定义为VARCHAR2(1000)
将列大小定义为您准备处理的最大长度。对于临时表,我将文件加载到数据库中,我可以使用 VARCHAR2(4000)。然后,一旦所有数据都在数据库中,我就可以进行所需的任何验证(数据类型、数据长度、最小/最大值、可接受的字符......)并将有效值传递到具有适当定义的列中/约束。
我可以利用DML 错误日志记录,以便将不符合定义/约束的数据发送到拒绝表,而无需任何棘手的逐行编码。
如果你有一个 VARCHAR2(1000) 那么,在某些时候你会得到比你预期更长的数据(例如,你可能会得到一个 10 个字符的字符串,但它有 14 个字节,因为有些字符是多字节字符集值。)