【问题标题】:Oracle - datatype to store number of a specific lengthOracle - 存储特定长度数字的数据类型
【发布时间】:2012-10-06 22:05:10
【问题描述】:

我正在尝试找出我应该在我的数据库中使用什么数据类型来存储一个固定的 8 位数字。

我应该使用char(8),即使它接受其他字符并在应用程序端进行验证,还是有类似number(x) 的东西可以做到?

我在电话号码列中遇到了同样的困境。我应该使用char(x) 还是更合适的?

编辑 - 回答您的问题:

  1. 第一个固定的 8 位数字最有可能用作主键。它代表我国的社会安全号码。不会对该列进行任何算术运算。我需要保留所有数字(甚至可能是前导零)。虽然,它可能会排序(因为它将是主键)
  2. 对于电话号码,我打算将其存储为这样的字符串:12345678901。问题更多的是关于“我如何确保这个 char[] 不接受字母或其他字符。是否应该在客户端进行此验证?

【问题讨论】:

  • 您将如何使用该值?它只是一串数字,比如帐号吗?或者你真的会做任何数学运算吗?你能保证你永远需要更多的字符,或者也使用字母字符吗?等等等等……
  • 电话号码使用字符。前导 0 很重要,可以包含 () 和 + 字符。

标签: sql oracle types sqldatatypes


【解决方案1】:

使用整数类型,例如 int。

【讨论】:

  • 请提供更多细节。单行可能会被删除。
  • 你想要一个更好的答案问一个更好的问题。您使用数字数据类型、句点来存储数字。
  • 除非它不是数字。我不会在数字字段中存储电话号码。
【解决方案2】:

如果您打算将数字用于数学运算,则应始终使用数字数据类型来存储数字。所以请使用NUMBER 并确保您可以使用 NUMBER(8) 指定它的长度,但请确保您永远不会使用更长的数字。

更多关于Oracle Data Types

对于电话号码,最好将其存储为CHAR(11)。我建议您在存储之前删除任何无用的字符,同时确保数据的一致性。

因此“1 (888) 673-1234”将在您的表中存储为“18886731234”。

【讨论】:

  • 恕我直言,您并不总是将数字存储在数字数据类型中,请参阅@Dems 第一条评论
  • 您说总是将数字数据存储为数字类型。然后你表明你不会对电话号码这样做,即使你去掉了所有非数字字符?
  • @Dems:我误读了他的问题并解释了两个问题,一个是关于存储数字(用于数学用途),另一个是关于存储数字(用于非数学用途)。我的错。
【解决方案3】:

如果您不进行任何数字操作或用作主键,则使用 char(8),因为您可以使用 number(8):如果使用 number(8) 数据类型并存储 1234,它将仅存储 4 位需要被格式化为显示为 8 位。

【讨论】:

    【解决方案4】:

    视情况而定。

    是数字吗?你会对这个数字进行数学运算吗?你会按数字排序吗?如果是,则将其存储为数字。您还应该创建一个约束以确保该数字始终为 8 位:

    number_field number(8) check (number_field between 11111111 and 99999999)
    

    如果它更像是一个代码(如信用卡号、社会保险号或帐号),我想我会使用 char(8) 和一个检查约束来确保它只包含数字(正则表达式是一个很好的用途)。通过使用 char 数据类型而不是 varchar,您无需确保该字段包含 8 个字符,只需确保这些字符都是数字。

    code_field char(8) check (regexp_like(code_field, '[:digit:]{8}'))
    

    实际上,您想要的是 ,但 Oracle 没有。

    至于验证客户端还是服务器端,在我的世界里,我总是依靠数据库约束来确保存储在数据库中的数据尽可能干净。在我的应用程序中,我测试约束违规以向用户返回适当的错误。当然,您也可以在客户端进行验证,但为什么要重复自己呢?唯一的情况是您希望避免往返服务器。

    【讨论】:

    • 为什么要检查两次?腰带和护腕以及更简单的用户反馈。 +1,很好的答案。
    • 是的,我通常只做一次,例如移动应用程序,如果您可以先在客户端检查它,您希望完全避免缓慢的往返。但是使用 MDD 技术,我们可以生成必要的客户端验证代码。
    猜你喜欢
    • 2013-08-02
    • 2018-02-20
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多