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】
【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:
分享到:
相关推荐
Oracle接收长度大于4000的字符串 Oracle接收长度大于4000的字符串
oracle中varchar2(byte)和varchar2(char) 细节决定成败,大家在设计数据库建表的时候一定要注意。
VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes DATE 日期(日-月-...
oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载
主要介绍了Mysql中varchar长度设置方法的相关资料,本文还给大家带来了valar类型的变化及char()和varchar()的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Oracle的数据类型: 1、CHAR数据类型,该类型是固定长度的字符串,如果没指定大小,则默认占用一字节,如果输入的值小于... 8、ORACLE其实也支持INTEGER,FLOAT,DOUBLE,VARCHAR,最好用ORACLE自身的NUMBER 和 VARCHAR2
浅析Oracle中char和varchar2的区别 电脑资料.docx
VARCHAR2(n) 变长字符串 最大长度为4000字节 没有默认长度必须指定 NCHAR(n) 用于存储定长为n的Unicode字符最大长度为2000字节 NVARCHAR2(n) 用于存储变长为n的Unicode字符串 最大长度为4000字节 LONG 存储最大长度...
oracle中varchar与date的转换,number与varchar的转换.pdf
VARCHAR2() varchar2数据类型是一种可变长度的、有最大长度的字母数字型数据。Varchar2类型的字段长度可以达到4000字节,Varchar2类型的变量长度可以达到32676字节。 一个空的varchar2(2000)字段和一个空的varchar...
oracle数据库表结构转gp数据库表结构、转mysql、数据库时表字段长度问题
主要介绍了MySQL动态修改varchar长度的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Oracle SQL 函数进行BLOB转换Varchar2
今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533
varchar2,Oracle还要进行语法分析,这个字段是多少位的,所以慢一些。相对于上千万的记录来说。一般的项目 没什么区别,随便用。 您可能感兴趣的文章:oracle to_char函数将number转成stringOracle to_char函数的...
VARCHAR2可变长度字符域,最大长度可达4000个字符 NVARCHAR2多字节字符集的可变长度字符域,长度随字符集而定,最多为4000个字符或4000个字节 DATE用于存储全部日期的固定长度(7个字节)字符域,时间作为日期的一...
是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备
oracle字段类型小结 CHAR固定长度字符串,最大长度2000,bytes VARCHAR2可变长度的字符串,最大长度4000,bytes,可做索引的最大长度749 NCHAR根据字符集而定的固定长度字符串,最大长度2000
VARCHAR(n): 最大长度为 n 的变长字符串。 CHAR (5) 和 VARCHAR2(5)的区别是 CHAR不足5位后面自动加上空格,VARCHAR2不加 三、 列的非空属性NOT NULL: 如果一个列具有非空属性,则在给该表增加、修改数据时必须...