无法在 SQL CREATE TABLE 命令中为 INTEGER 数据类型设置精度

Unable to set precision for INTEGER data type in SQL CREATE TABLE command

我正在尝试在 Oracle 中创建以下 table。

CREATE TABLE CUSTOMER(CUST_ID INT(10),
CUST_NAME   VARCHAR2(50),
CUST_SEX    CHAR(2),
CUST_STATE  VARCHAR2(50),
CUST_COUNTRY    VARCHAR2(50));

我收到一条错误消息,指出缺少右括号。实际上,问题出在 CUST_ID 列的 INT 数据类型上。从 DDL 查询中删除精度 :(10) 后,我就能够成功执行它。

Oracle 文档没有指定任何关于此数据类型是否可以伴随精度参数的信息。但是 Oracle 确实提到 INTEGER/INT 符合 ANSI 标准。

https://docs.oracle.com/cd/B19306_01/olap.102/b14346/dml_datatypes002.htm

某些其他非官方参考资料将 INT/INTEGER 描述为 NUMBER(38) 的同义词。

有人可以告诉我是否确实不能为 INT 数据类型指定精度?

Oracle docs 声明:

SQL statements that create tables and clusters can also use ANSI data types and data types from the IBM products SQL/DS and DB2. Oracle recognizes the ANSI or IBM data type name that differs from the Oracle Database data type name. It converts the data type to the equivalent Oracle data type

正如该句下方的 table 所述,intinteger 和(令人惊讶的是?)smallint 都是 number(38) 的同义词,因此您不能为它们指定精度。对于你的用例,如果你想要一个十位数的整数,你应该使用 number(10).

让我试试:确实不能为 INT 数据类型指定精度。

听起来怎么样?

文档说:

<snip>
| { NUMERIC | DECIMAL | DEC } [ (precision [, scale ]) ]  --> precision + scale
| { INTEGER | INT | SMALLINT }                            --> no precision for integers
| FLOAT [ (size) ]
<snip>

Oracle 中的 INT[EGER] 数据类型(至少应该是 4 字节二进制整数)存在于 PL/SQL 存储过程中(如果有的话)。

最好的办法是为 SMALLINT 设计 NUMBER(5),为 INTEGER 设计 NUMBER(9),为 LARGEINT/BIGINT

设计 NUMBER(18)

如果你去:

CREATE TABLE dropme (i INT);

,在 Oracle 中,你会得到一个 table 和一个列 i NUMBER(没有长度规范,归结为漂亮的 in-efficient NUMBER(38).

Oracle 数值数据类型是 NUMBER 和 FLOAT。

具有可选的整体精度和可选的小数位

而一个 Oracle NUMBER,至少据我所知,是一个 variable-length 构造,带有一个二进制 two-byte,用于整个事物的长度指示符,后跟一个二进制十进制表示法,其中每个 half-byte 可以在 0000 和 1001 之间,二进制或 09 - 最后一个除外,它包含符号:positive/negative .

作为the documentation saysINTEGER等同于NUMBER(38)

您可以只在要存储任意大小的整数的地方使用 INTEGER,或者如果您想将值中的位数限制为 n,则可以使用 NUMBER(n) ].

注意:在 Oracle 中指定精度的唯一原因是为了验证和文档。使用较小的 n 值没有 space 优势:值 123456 在 NUMBER(6)NUMBER(38)INTEGER 列中占用相同数量的字节 - 即4 个字节。