我正在试图找出我应该在数据库中使用哪种数据类型来存储固定的8位数字。
我是否应该使用char(8)
,即使它接受其他字符并在应用程序方面进行验证,或者有number(x)
之类的内容可以使用它?
我的电话号码栏也遇到了同样的困境。我应该使用char(x)
还是更合适?
编辑 - 您的问题的答案:
12345678901
。问题更多的是“如何确保此char[]
不接受字母或其他字符。是否应该在客户端进行此验证?答案 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。