【问题标题】:Why does it needed to define data-type's size in oracle (or any other DB)?为什么需要在 oracle(或任何其他数据库)中定义数据类型的大小?
【发布时间】:2016-08-06 12:28:36
【问题描述】:

假设我正在创建一个包含一些列的表,例如:

COLUMN_NAME   DATA_TYPE            NULLABLE   and .......
===========   =========            ========   ============================
NAME          VARCHAR2(100 BYTE)   No
GENDER        VARCHAR2(1 BYTE)     No

在创建表时,我需要定义 NAME (100 BYTE)GENDER (1 BYTE) 列的数据大小。 有人能解释一下这样做的确切目的吗?

对于NAME 列,我分配100 BYTE。但有时名称值可能不会占用100 BYTE。所以它浪费了一些空间,对吧?为什么DB本身不能自动管理?

【问题讨论】:

  • varchar 是可变长度数据类型。在 varchar(100) 列中仅存储 1 个字符时不会浪费空格。
  • @a_horse_with_no_name 谢谢,但我可以知道定义该可变长度的目的吗?
  • 这是一个业务限制。您声明您不想将值存储得更长(顺便说一句。在 Postgres 中,您不需要指定最大长度)。您可能想阅读以下内容:stackoverflow.com/q/8295131/330315 和 Oracle 概念指南:docs.oracle.com/database/121/CNCPT/…

标签: sql database oracle


【解决方案1】:

varchar2 参数定义了允许在列中存储的最大字符数。这与每行分配的实际存储空间几乎没有关系。只要实际存储的值适合,数据库就可以尽可能少地使用。

但是,数据库通常会在存储一行时为每个块添加一些边距/额外空间,以便在值更改时允许增长。这使用多少取决于 PCTFREE 表设置。

即使剩下的额外空间不够用,值仍然可以存储。数据库只需将其他数据推送到同一个存储盒(称为块)中。然而,如果盒子已满,则必须分配另一个块并将数据拆分到这些块上。这会导致碎片化,从而对性能产生负面影响。

回到原来的存储限制,它说明了该列中每一行的最大存储限制。不得超过此金额。并且这个限制可以设置多大是有限制的。对于 varchar2,在大多数 Oracle 版本上它是 4K。可能是因为大多数平台上的默认块大小曾经是 4K。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多