为什么需要在Oracle(或任何其他数据库)中定义数据类型的大小?
为什么需要在Oracle(或任何其他数据库)中定义数据类型的大小?
举个例子,假设我正在创建一个包含以下列的表格:\n
COLUMN_NAME DATA_TYPE NULLABLE and ....... =========== ========= ======== ============================ NAME VARCHAR2(100 BYTE) No GENDER VARCHAR2(1 BYTE) No
\n在创建表格时,我需要为列NAME (100 BYTE)
和GENDER (1 BYTE)
定义数据大小。\n有人可以解释一下这样做的目的是什么吗?\n对于NAME
列,我分配了100 BYTE
的空间。但有时候名字的值可能不会占用100 BYTE
的空间。那么这不是浪费了一些空间吗?为什么数据库不能自动管理这个呢?
为什么需要在Oracle(或任何其他数据库)中定义数据类型的大小?
在Oracle(或任何其他数据库)中,定义数据类型的大小是为了限制在列中存储的最大字符数量。这与每行实际分配的存储空间几乎没有关系。只要实际存储的值适合,数据库可以使用尽可能少的空间。
然而,当存储一行时,数据库通常会在每个块中添加一些余量/额外空间,以便在值改变时允许增长。这使用的空间取决于PCTFREE表设置。
即使剩下的额外空间不够,值仍然可以存储。数据库只需将其他数据推入相同存储框(称为块)中。然而,如果框变满,就必须分配另一个块并将数据分割到这些块上。这会导致碎片化,对性能产生负面影响。
回到最初的存储限制,它规定了此列中每行的最大存储限制。不能超过这个限制。而且对于varchar2类型,这个限制的设置有一定的限制。在大多数Oracle版本中,它是4K。可能是因为大多数平台上默认的块大小是4K。
在Oracle(或任何其他数据库)中定义数据类型的大小是为了限制在列中存储的最大字符数量。这与每行实际分配的存储空间几乎没有关系。只要实际存储的值适合,数据库可以使用尽可能少的空间。
然而,当存储一行时,数据库通常会在每个块中添加一些余量/额外空间,以便在值改变时允许增长。这使用的空间取决于PCTFREE表设置。
即使剩下的额外空间不够,值仍然可以存储。数据库只需将其他数据推入相同存储框(称为块)中。然而,如果框变满,就必须分配另一个块并将数据分割到这些块上。这会导致碎片化,对性能产生负面影响。
回到最初的存储限制,它规定了此列中每行的最大存储限制。不能超过这个限制。而且对于varchar2类型,这个限制的设置有一定的限制。在大多数Oracle版本中,它是4K。可能是因为大多数平台上默认的块大小是4K。