【问题标题】:Oracle SQL unsigned integerOracle SQL 无符号整数
【发布时间】:2013-05-02 12:26:38
【问题描述】:

在Oracle中,什么相当于MySQL的UNSIGNED?

我有以下查询,只是它不起作用:

CREATE TABLE foo
(
  id INT UNSIGNED NOT NULL PRIMARY KEY
);

编辑:我的目的是节省空间,因为对于某些字段,我不会使用负值。或者,它会回答我的问题,即有人确认我所要求的在 Oracle 11g 中是不可能的,或者如果有可能,但并不简单(每个 unsigned int 超过 3 行代码)。

另外,它不一定是关于 int。我也使用 smallint 和 tinyint。

【问题讨论】:

  • 你真正想要发生什么 - 你想防止负数被存储?您想要一系列有效值吗?如果有人试图插入负数或超出范围的数字,您希望发生什么?
  • 我已经编辑了我的帖子。
  • 如果您非常担心数据将使用多少字节,您可能不想使用 Oracle 或任何其他当前的关系或非关系 DBMS。

标签: sql oracle11g


【解决方案1】:

如果要匹配here 显示的限制,可以使用检查约束:

SQL> create table foo (id number primary key, 
    constraint foo_uint_id check (id between 0 and 4294967295));

Table created.

SQL> insert into foo (id) values (-1);

insert into foo (id) values (-1)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.FOO_UINT) violated

SQL> insert into foo (id) values (0);

1 row created.

SQL> insert into foo (id) values (4294967295);

1 row created.

SQL> insert into foo (id) values (4294967296);

insert into foo (id) values (4294967296)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.FOO_UINT_ID) violated

SQL> select * from foo;

        ID
----------
         0
4294967295

【讨论】:

  • 我也想占用更少的空间。或者,如果有人确认我的任务不能以简单的方式完成,我会很满意。
  • 号码存储可能无法如您所愿;见this AskTom article。使用更少的空间可能不是一个有用的目标?
【解决方案2】:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#i54330 是 Oracle 内置数据类型的最终列表。

如果你想要整数的语义,那么number(n) 基本上是你唯一的选择。我个人使用integer,这是number(38) 的一种略短的说法。

【讨论】:

  • 那么Oracle不支持无​​符号整数呢?
  • Oracle 通过使用 Alex 概述的约束方法,但不是作为本机数据类型。
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 2010-09-19
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2011-11-08
  • 2018-08-18
相关资源
最近更新 更多