`
can_do
  • 浏览: 262449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle的number的整数位最大长度是38(小数位最大长度是127位),varchar2的最大长度是4000

阅读更多
SQL> alter table can_do modify id number(39);
alter table can_do modify id number(39)
                                    *
ERROR at line 1:
ORA-01727: numeric precision specifier is out of range (1 to 38)


SQL> alter table can_do modify name varchar2(4001);
alter table can_do modify name varchar2(4001)
                                        *
ERROR at line 1:
ORA-00910: specified length too long for its datatype


SQL>

说明:number的默认值是38,number的范围是(1~38)。varchar2没有默认值,必须指定长度。(1~4000)

Tip:关于number类型在Oracle中的定义,number(p[,s]),p为:precision,s为:scale

范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126  
保存在机器内部的范围: 1 ~ 22 bytes

number(p,s)含义:小数点右边不超过s位,小数点左边和右边总位数不超过p位。

如果定义为:id number的话,则precision和scale没有指定,即相当于number(38,7)。

小数点右边最多7位,小数点左边和右边总位数不超过38位数字

如果定义为:id number(5)的话,则precision为5,scale为0,小数点右边没有位数,小数点左边最多5位数字,如果输入的数字是带小数位的如:12345.71的话,Oracle会自动进行四舍五入,变为:

12346,如果输入的是12345.48的话,会自动四舍五入为:12345。

如果定义为:salary number(6,2)的话,则precision为6,scale为2,即小数点右边边最多两位,小数点左边和右边总位数不超过6位(不包括小数点“.”)。

关于id number类型定义后的实验:

SQL> create table can_do_temp (id number primary key,name varchar2(100));

Table created

SQL> desc can_do_temp;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER
NAME                                               VARCHAR2(100)

SQL> select * from can_do_temp;

        ID NAME
---------- -----------------------
-
1.0000E+39 1
1.0000E+39 2
1.0000E+40 3
1.0000E+38 4
1.0000E+37 5
1.0000E+38 6

按正常的考虑,id可以吸收的最大值是38个9即:【99999999999999999999999999999999999999】

select length('99999999999999999999999999999999999999') from dual;

也就是说表can_do_temp的id最大值为1.0000E+38

那么1.0000E+39是怎么插入进去的呢?

如果你使用power函数的话,是可以插入的,如:

SQL> insert into can_do_temp b (id,name) values (power(10,40)-1,'1');

1 row created.

SQL> commit;

Commit complete.

但是如果你不使用power函数而是直接写39个9的话,会提示主键冲突,如下

SQL> insert into can_do_temp b (id,name) values (999999999999999999999999999999999999999,'1');
insert into can_do_temp b (id,name) values (999999999999999999999999999999999999999,'1')
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C005211) violated

不知这个是Oracle的bugs还是Oracle本身就没有限制number的最大位数。

再试验个够狠的:

SQL> insert into can_do_temp b (id,name) values (power(10,100)-1,'9');

1 row created.

SQL> commit;

Commit complete.

SQL> alter table can_do_temp modify age number(38,128);
alter table can_do_temp modify age number(38,128)
                                             *
ERROR at line 1:
ORA-01728: numeric scale specifier is out of range (-84 to 127)


SQL> alter table can_do_temp modify age number(39,7);
alter table can_do_temp modify age number(39,7)
                                          *
ERROR at line 1:
ORA-01727: numeric precision specifier is out of range (1 to 38)

SQL> alter table can_do_temp modify age number(3,4);

Table altered.

SQL> desc can_do_temp;
Name                                      Null?    Type
----------------------------------------- -------- ------------------------
ID                                        NOT NULL NUMBER
NAME                                               VARCHAR2(100)
AGE                                                NUMBER(3,4)

SQL> insert into can_do_temp values(1,'14',2.1234);
insert into can_do_temp values(1,'14',2.1234)
                                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

建议在定义数据类型时不要写为:id number,

即不指定precision(scale)的格式是不赞成的。

而且一般的都是p>3的定义格式。

【编写于 2009-01-21】

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

    数据库基础知识

    例如,number(2, 3) 表示一个浮点数,整数位为 2 位,小数位为 3 位,可以存放的最大数是 0.099。 在 Oracle 中,number 类型的使用非常灵活,可以根据实际情况定义不同的数值类型。 二、Oracle 中的字符串类型 ...

    Oracle数据库常用数据类型.doc

    * VARCHAR2:可变长度字符串,最大长度 4000 bytes。VARCHAR2 类型适合存储可变长度的字符串,如姓名、地址等。 * NCHAR:根据字符集而定的固定长度字符串,最大长度 2000 bytes。NCHAR 类型适合存储 Unicode 字符串...

    oracle支持的数据类型

    15. NUMBER(P,S): 数字类型,P表示整数位数,S表示小数位数,总位数可达38位,适用于存储大范围数值。当不需要指定小数位数时,可以使用INTEGER和DECIMAL,它们是NUMBER的别名。 16. FLOAT: 浮点数类型,相当于...

    Oracle数据库第2讲.pptx

    例如,NUMBER(5, 2) 表示一个小数有 5 位有效数,2 位小数。 4. 日期和时间类型:DATE、TIMESTAMP 等。 DATE 是日期类型,范围为公元前 4712 年 1 月 1 日到公元 4712 年 12 月 31 日。 TIMESTAMP(n) 是时间戳类型...

    Oracle数据类型说明

    2. VARCHAR2:VARCHAR2是可变长度的字符串数据类型,最大长度为4000个字节。与CHAR不同,VARCHAR2不填充空格,只存储实际输入的字符,更节省空间。 3. NCHAR:NCHAR是基于Unicode字符集的固定长度字符串类型,最大...

    oracle和sql数据类型

    2. **Varchar2**: Varchar2 是可变长度的字符串类型,最大长度为 4000 bytes。相比 Char,它只存储实际输入的字符,节省空间。 3. **Nchar**: Nchar 是基于字符集的固定长度字符串类型,最大长度为 2000 bytes。它...

    Oracle数据库基本数据类型.pdf

    number 数据类型的特点是可以指定整数位数(m)和小数位数(n),例如 number(5,2) 表示这个字段的最大值是 99,999。number 数据类型适合用于存储数值数据,例如金额、数量等。 date 数据类型是用于存储日期和时间...

    oracle-字段类型.pdf

    2. **VARCHAR2**:这是可变长度的字符串类型,最大长度为4000字节。与CHAR不同,VARCHAR2只存储实际的字符数据,不填充空格。对于索引,最大长度限制为3209字节。 3. **NCHAR**和**NVARCHAR2**:这两种类型分别代表...

    oracle字段说明

    number 型既可以用来表示整数,又可表示小数。 7. DATE:日期类型,保存定长的日期或时间数据,范围为公元前 4712/01/01 到公元 9999/12/31。每行固定为 7 字节长度,缺省值的日期描述(例如 DD-MON-YY)由 NLS_...

    ORACLE 10g 数据类型

    `varchar2(n)` 的最大长度为 4000 个字节。 2. 数值型 Oracle 中的数值型主要由 `number` 类型涵盖,它可以存储整数、浮点数和实数。`number(p,s)` 中,`p` 表示精度,即总位数,最大为38,`s` 表示小数位数,范围...

    Oracle各种数据类型的介绍,适合中高级编程开发人员

    NCHAR的最大长度为2000个字符,而NVARCHAR2的最大长度为4000个字符。 #### Number 类型 - **NUMBER**: Oracle的数字类型,可以存储整数、小数甚至是负数。NUMBER类型的取值范围非常宽泛,可以达到38位精度,即...

    Oracle数据库第2讲1001.pptx

    例如,`NUMBER(5,2)`表示最多5位数字,其中2位是小数。 3. **时间日期类型**: - `DATE`:包含年月日、时分秒的时间日期类型,支持公元前4712年到公元4712年的日期范围。 - `TIMESTAMP(n)`:带有秒精度的时间戳,...

    Oracle经典教程2——SQL数据库操作和查询

    - **VARCHAR2(length)**:存储可变长度的字符串,`length`指定了字符串的最大长度。默认长度为1,最大长度为4000字符。 - **NUMBER(p,s)**:既可用于存储浮点数,也可用于存储整数。`p`表示数字的最大位数(包括整数...

    Oracle基本数据类型[借鉴].pdf

    2. **Varchar2(n)**: Varchar2是Oracle中最常用的字符串类型,最大长度为4000字节。与Char不同,Varchar2根据实际存储的数据长度占用空间,这节省了存储空间。在Oracle 8i及之后的版本中,如果数据前后有空格,系统...

Global site tag (gtag.js) - Google Analytics