用 Oracle 来说,这将是一个
NUMBER(9, 0)
或任何映射到 32 位(甚至 16 位或 64 位)整数的内容。
CREATE TABLE T(C1 NUMBER, C2 NUMBER(9, 0) ); -- Unconstrained and constrained number
INSERT INTO T(C1, C2) VALUES (10, 10);
SELECT C1, C2 FROM T; -- C1 is NUMBER, C2 is NUMBER(9,0)
Oracle 假定了精度和小数位数,然后似乎没有办法在不修改表结构本身的情况下设置它们:
SELECT
CAST(C1 AS INTEGER) FAILURE1, -- Unconstrained number
TRUNC(C1) FAILURE2, -- Unconstrained number
ROUND(C1, 0) FAILURE3, -- Unconstrained number
CAST(ROUND(C1, 0) AS NUMBER(9, 0)) FAILURE4, -- Unconstrained number
TO_NUMBER(TO_CHAR(PERCENT_DONE, '99') FAILURE5, -- ~Overcomplicated and still fails
FROM T
这使得编写与 Oracle 一起使用的应用程序变得更加困难,并且还使它们变得更慢且内存效率更低。像 Stack Overflow 自己的 Dapper 这样的 ORM 及其底层驱动程序不知道不受约束的数字可能包含什么,因此它们将这些列映射到类型,例如
System.Decimal
,而不仅仅是简单的整数类型。
Oracle 确实有
TO_BINARY_FLOAT()
和 TO_BINARY_DOUBLE()
分别映射到 float 和 double,但是如何用整数来完成呢?
您可以对列使用约束来确保值符合 32 位有符号限制:
CREATE TABLE T
(C1 NUMBER,
C2 NUMBER(10, 0)
CONSTRAINT T_C2_VALUE_CHECK
CHECK(C2 BETWEEN -2147483648 AND 2147483647))
不知道/您的 ORM 是否可以利用此信息。