【问题标题】:Storing value with size greater than column size存储大小大于列大小的值
【发布时间】:2016-01-05 10:07:46
【问题描述】:

需要讨论一种方法: 我们在 oracle 表中有一个 count 列。列的数据类型为char(3 Byte)。每次插入一行时,count 列的值都会增加 1(但它不是标识列)。

价值有可能超过999。那么我们该如何处理呢。 到目前为止,我能够证明的方法是:

在运行时增加列数据类型。步骤是:

  1. 首先,我们将检查值的长度。
  2. 例如,如果长度为 4,则更改表的列并将列的大小更改为 char(4 BYTE)

人们可以提供的任何更好的方法...

【问题讨论】:

  • 只是出于好奇,如果是计数,我想它是一个数字。为什么使用 char 数据类型?
  • 使用数字列类型,或使用不会超出大小的任意大字符。
  • 永远不要,永远不要在 charvarchar 列中存储数字(而 varchar 总是比 char 更好的选择)
  • 始终使用 VARCHAR2 而不是 CHAR 或 VARCHAR。 (绝不应使用 VARCHAR)。

标签: sql oracle


【解决方案1】:

在运行时增加列数据类型。

证明设计有缺陷。您永远不应该在运行时修改表。

根据您的要求,没有理由将 NUMBER 存储为 STRING。这肯定是性能下降的主要原因。您应该选择正确的数据类型,在您的情况下应该是 NUMBER

每插入一行,count列的值增加1

理想情况下,您应该为此使用序列。根据您的数据库版本,有两种选择:

附带说明,CHAR 数据类型存储固定长度的字符串。理想情况下,您应该使用 VARCHAR2 数据类型,它存储可变长度的字符串。

【讨论】:

    【解决方案2】:

    您真的,真的不应该将数字存储在 char 或 varchar 列中。如果可能,请重构导致您陷入此问题的表格设计。

    如果您不能这样做,您确定不能将列从 char(3) 更改为更有用的内容吗? Char(4) 仅多 1 个字节的存储空间,如果 char(3) 一直在其他地方工作,则 varchar(4) 通常可能没有额外的存储空间。

    如果你真的不能做其中任何一个,你仍然被困在这个泡菜中,你绝对必须在 char(3) 列中输入一个超过 999 的数字,即使之后一边踢一边尖叫说这不是一个好主意......

    以十六进制存储。注意这个非常清楚,否则它会混淆人们,但十六进制到十进制的转换并不是什么黑色艺术,它会在同一字符空间内为您提供高达 4095 的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2018-04-14
      • 1970-01-01
      • 2014-10-17
      • 2011-02-04
      相关资源
      最近更新 更多