2

我试图弄清楚我应该在我的数据库中使用什么数据类型来存储一个固定的 8 位数字。

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

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

编辑 - 回答您的问题:

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

4 回答 4

8

这取决于。

是数字吗?你会对这个数字进行数学运算吗?你会按数字排序吗?如果是,则将其存储为数字。您还应该创建一个约束以确保该数字始终具有 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 没有它们。

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

于 2012-10-16T18:34:27.317 回答
0

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

有关Oracle 数据类型的更多信息。

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

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

于 2012-10-16T18:23:54.533 回答
0

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

于 2012-10-16T18:29:38.800 回答
-1

使用数值类型,例如 int。

于 2012-10-16T18:22:33.710 回答