代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

为什么必须设置数据库中每个文本列的最大长度?

  •  6
  • John Leidegren  · 技术社区  · 14 年前

    为什么每个RDBMS都坚持要你告诉它一个文本字段的最大长度是多少。。。为什么它不能从放入数据库的数据中推断出这些信息呢?

    我主要使用mssqlserver,但我所知道的其他数据库也要求您对数据模式设置这些任意限制。实际情况是,这并不是特别有帮助或友好的工作,因为业务需求一直在变化,几乎每天都有一些最终用户试图在该专栏中输入大量文本。

    任何一个拥有RDBMS内部工作知识的人知道为什么我们不能从放入存储的数据中推断出限制吗?我说的不是猜测类型信息,而是猜测特定文本列的限制。

    我的意思是,我不在数据库中的每个文本列上使用nvarchar(max)是有原因的。

    9 回复  |  直到 13 年前
        1
  •  6
  •   tvanfosson    14 年前

    因为计算机(和数据库)是愚蠢的。电脑猜得不太准,除非你告诉他们,否则他们无法判断一个专栏将被用来写一个电话号码或一本《战争与和平》。显然,DB的设计可以使每一列都可以包含无限量的数据——或者至少是磁盘空间允许的数据量——但这将是一个非常低效的设计。为了提高效率,我们做了一个权衡,让设计者告诉数据库我们希望在列中输入多少。可能有一个默认值,如果您不指定,它只会使用它。不幸的是,从效率的角度来看,任何违约都可能不适合绝大多数人。

        2
  •  2
  •   Covar    14 年前

    这和速度有关。如果指定了字符串的最大大小,则可以优化信息的存储方式,以便更快地对其进行i/o。当速度是关键的时候,你最不希望的事情就是因为你把一个州的缩写改成了全名而突然对你所有的数据进行洗牌。

    设置最大大小后,数据库可以将最大空间分配给该列中的每个实体,而不考虑对值的更改,也不需要更改地址空间。

        3
  •  1
  •   Community CDub    7 年前

    This post 不仅回答了你关于是否使用 nvarchar(max) 但它也让我们了解了为什么数据库历史上不允许这样做。

        4
  •  1
  •   Malfist    14 年前

    这就像在说,为什么我们不能告诉数据库我们想要一个表,让它从我们提供的数据中推断出我们需要什么类型和多少列呢。

    简单地说,我们比数据库更清楚。假设你有百万分之一的机会把一个2000个字符的字符串放入数据库,大多数时候,它是100个字符。数据库可能会破坏或拒绝2k字符串。如果前三年你只输入了100个长度的字符串,它根本不知道你需要2k的长度。

        5
  •  0
  •   vodkhang    14 年前

    如果RDBMS每次添加、更新和删除时都将列的数据长度更改为固定的数字(例如,所有行的最大长度)。这是一个非常耗时的过程

        6
  •  0
  •   joelt    14 年前

        7
  •  0
  •   Sakhawat    14 年前
        8
  •  0
  •   Philip Kelley    14 年前

    作为一个例子,我将进入一些流沙,并建议您将其与分配内存(RAM)的应用程序进行比较。为什么程序员不在程序启动时要求/分配他们需要的所有内存呢?因为他们常常不知道自己需要多少。这会导致应用程序在运行时占用越来越多的内存,也许还会释放内存。你有多个应用程序同时运行,新应用程序启动,旧应用程序关闭。而且应用程序总是需要连续的内存块,如果它们的内存分散在整个地址空间,那么它们的工作就会很差(如果有的话)。随着时间的推移,这会导致碎片化的记忆,以及人们几十年来一直在撕扯的垃圾收集问题。

    跳回数据库。你想让你的硬盘发生这种情况吗(记住,硬盘性能是非常重要的, 非常 与内存操作相比速度慢……)

        9
  •  0
  •   JeffO    14 年前

    听起来您的业务规则是:在任何文本框中输入您想要的信息,这样您就不会对DBA生气。

    你不允许用户输入5000个字符的地址,因为它们不能放在信封上。