Oracle - 用于存储特定长度的数据的数据类型

时间:2012-10-16 18:15:35

标签: sql oracle types sqldatatypes

我正在试图找出我应该在数据库中使用哪种数据类型来存储固定的8位数字。

我是否应该使用char(8),即使它接受其他字符并在应用程序方面进行验证,或者有number(x)之类的内容可以使用它?

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

编辑 - 您的问题的答案:

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

4 个答案:

答案 0 :(得分:7)

取决于。

是号码吗?你会对这个数字进行数学运算吗?你会用数字排序吗?如果是,则将其存储为数字。您还应该创建一个约束以确保该数字始终具有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 :(得分:0)

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

更多关于Oracle Data Types

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

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

答案 2 :(得分:0)

如果您没有使用数字操作或使用数字(8)作为主键,请使用char(8):如果使用数字(8)数据类型并存储1234,则只存储需要的4位数字被格式化为显示为8位数。

答案 3 :(得分:-1)

使用数字类型,例如int。