澳门金沙vip 12

Oracle 建表常用数据类型的详解

建立表

create  table  表名(
    字段名1  类型,
    字段名2  类型,
     ........ 
    字段名n  类型);

类型有:  

  • char(n)       是一个类型,叫定长字符串,数据不够就补空格
  • varchar2(n) 是变长字符串(有多少就存多少,不会补空格)

创建表时,必须为表的各个列指定数据类型。如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存。如为学生指定出生日期为“1980-13-31”。

一、存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的

为什么要有这两种?

这是因为计算机是时间和空间的结合体,省时就浪费,不浪费就费时。比如结构体的对齐和补齐就是提高寻址效率的,但是浪费空间定长的字符串效率高,但是会浪费空间。变长字符串效率低一点,但是省空间。我们一般使用变长字符串,除非是那些基本上不改变长度的字符串就用定长字符串,至于提高效率方面还有别的语句去优化。

  • number(n,m)数字类型  n-m个整数位,m位小数位
  • number      一般用这个,不用指定几个整数几个小数(就像%f和%3.2f)
  • date         是日期类型

一般记上面这四种就行

 

还有其他的:但是都不怎么用了

因为一般都存储这些数据对应的路径,不用放到数据库中

  • BLOB澳门金沙vip,   0~4g  大二进制
  • CLOB   0~4g  大字符类型  
  • varchar2(n)一般能存几k左右(就是几千个字符)

  在Oracle中,常见的数据类型有:

 

演示:建立一张表(取别名和表名时不要用关键字,公司多会规定表名)

字段:

    • id   number ,
    • fname  char(10),
    • sname varchar(10)【没有写2不要紧,oracle会自动加2】,
    • salary number

    create table emp1111(id number, fname char(10), sname varchar(10), salary number);

澳门金沙vip 1

再查看:

desc emp1111;

澳门金沙vip 2

 

插入数据:

insert into emp1111 values(1, 'xsy', 'xsy', 12345);

澳门金沙vip 3

 

查询表:

select * from emp1111;

澳门金沙vip 4

 

查看定长字符串和变长字符串在长度上的区别:

select length(fname), length(sname) from emp1111;

澳门金沙vip 5

 

查询具体的数据也有区别,查询字符串‘xsy ’(带一个空格):

select * from emp111 where fname='xsy';

澳门金沙vip 6

 

  字符串:字符串分为定长类型char和变长类型varchar2。

二、mysql 数据类型

删除表

drop table  表名;

如果有人在操作该表,没有提交,就不能删除掉表,会提示正忙。

drop table emp1111;

澳门金沙vip 7

  数字:整数 number(整数位),小数
number(总长度,小数位),只写number,表示无限制。

 1.数字:(宽度指的是显示宽度,与存储无关)     不用指定宽度,用默认就OK

修改表结构(用的不多,一般是删表重建)

drop column  字段名;  删除一个字段
add  字段名  类型;    增加一个字段

先建立一张表,有四个字段:

create table emp1112(id number, fname char(10), sname varchar(10), salary number);

澳门金沙vip 8

 

删除一个字段:

alter table emp1112 drop column salary;

澳门金沙vip 9

 

查看结果:

desc emp1112;

澳门金沙vip 10

 

再加一个字段:(oracle里add不写colum,有些数据库要加)

alter table emp1112 add salary number;

澳门金沙vip 11

 

查看结果:

desc emp1112;

澳门金沙vip 12

 

  日期:date类型,可以保存年月日时分秒。

  默认都是有符号,要想变成无符号的,要先清空表内的记录再改

  问题:Oracle中为什么字符串类型为varchar2,它与varchar有什么关系?

  整型:tinyinit    int     bigint      
:个数,年龄,id,qq号,手机号

  回答:

     随着内部存储字节的增加,存储的数字大小也增加

  在Oracle中,
varchar已经作为了保留字。如果你使用varchar类型,Oracle也不会报错,但是建表以后你会发现,已经自动变为了varchar2类型。

澳门金沙vip 13澳门金沙vip 14

  问题:用number还是用integer(整数)?

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                -128 ~ 127
            无符号:
~ 255

            PS: MySQL中无布尔值,使用tinyint(1)构造。



========================================
        int[(m)][unsigned][zerofill]

            整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -2147483648 ~ 2147483647
            无符号:
~ 4294967295



========================================
        bigint[(m)][unsigned][zerofill]
            大整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -9223372036854775808 ~ 9223372036854775807
            无符号:
 ~  18446744073709551615

  另外Oracle也有integer等其它类型,但是用integer有缺点,就是不知道其长度,甚至可能在不同的操作系统上(如32位CPU和64位CPU)所分配的长度是不同的。而用number,指定多少,就永远是多少,一切掌握在自己手中。

View Code

  问题:如何为字符串和数字类型指定长度?

澳门金沙vip 15澳门金沙vip 16

  char类型可以不指定长度,则默认为1,而varchar2必须指定长度。

=========有符号和无符号tinyint==========
#tinyint默认为有符号
MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
MariaDB [db1]> desc t1;
MariaDB [db1]> insert into t1 values
    -> (-129),
    -> (-128),
    -> (127),
    -> (128);
MariaDB [db1]> select * from t1;
+------+
| x    |
+------+
| -128 | #-129存成了-128
| -128 | #有符号,最小值为-128
|  127 | #有符号,最大值127
|  127 | #128存成了127
+------+



#设置无符号tinyint
MariaDB [db1]> create table t2(x tinyint unsigned);
MariaDB [db1]> insert into t2 values
    -> (-1),
    -> (0),
    -> (255),
    -> (256);
MariaDB [db1]> select * from t2;
+------+
| x    |
+------+
|    0 | -1存成了0
|    0 | #无符号,最小值为0
|  255 | #无符号,最大值为255
|  255 | #256存成了255
+------+



============有符号和无符号int=============
#int默认为有符号
MariaDB [db1]> create table t3(x int); #默认为有符号整数
MariaDB [db1]> insert into t3 values
    -> (-2147483649),
    -> (-2147483648),
    -> (2147483647),
    -> (2147483648);
MariaDB [db1]> select * from t3;
+-------------+
| x           |
+-------------+
| -2147483648 | #-2147483649存成了-2147483648
| -2147483648 | #有符号,最小值为-2147483648
|  2147483647 | #有符号,最大值为2147483647
|  2147483647 | #2147483648存成了2147483647
+-------------+



#设置无符号int
MariaDB [db1]> create table t4(x int unsigned);
MariaDB [db1]> insert into t4 values
    -> (-1),
    -> (0),
    -> (4294967295),
    -> (4294967296);
MariaDB [db1]> select * from t4;
+------------+
| x          |
+------------+
|          0 | #-1存成了0
|          0 | #无符号,最小值为0
| 4294967295 | #无符号,最大值为4294967295
| 4294967295 | #4294967296存成了4294967295
+------------+




==============有符号和无符号bigint=============
MariaDB [db1]> create table t6(x bigint);
MariaDB [db1]> insert into t5 values  
    -> (-9223372036854775809),
    -> (-9223372036854775808),
    -> (9223372036854775807),
    -> (9223372036854775808);

MariaDB [db1]> select * from t5;
+----------------------+
| x                    |
+----------------------+
| -9223372036854775808 |
| -9223372036854775808 |
|  9223372036854775807 |
|  9223372036854775807 |
+----------------------+



MariaDB [db1]> create table t6(x bigint unsigned);
MariaDB [db1]> insert into t6 values  
    -> (-1),
    -> (0),
    -> (18446744073709551615),
    -> (18446744073709551616);

MariaDB [db1]> select * from t6;
+----------------------+
| x                    |
+----------------------+
|                    0 |
|                    0 |
| 18446744073709551615 |
| 18446744073709551615 |
+----------------------+




======用zerofill测试整数类型的显示宽度=============
MariaDB [db1]> create table t7(x int(3) zerofill);
MariaDB [db1]> insert into t7 values
    -> (1),
    -> (11),
    -> (111),
    -> (1111);
MariaDB [db1]> select * from t7;
+------+
| x    |
+------+
|  001 |
|  011 |
|  111 |
| 1111 | #超过宽度限制仍然可以存
+------+

  char和varchar类型的长度最大长度大约在4000多一点点。

View Code

  number表示不限整数或小数,它能够保存非常大的数字或者保存小数位非常多的数字。所以为了节约磁盘空间,尽量指定长度。

  小数:        价格,身高,体重,余额

  date:不需要指定长度。

     float :小数位数越多越不精准
             double :小数位数越多越不精准

  问题:字符串最大长度约为4000。如果要保存更多的内容怎么办?

     decimal:(如果用小数,则用推荐使用decimal)
                    精准(因为内部原理是以字符串形式去存)
     eg:create table t1(salary float(5,2));         #5代表
salary代表一共有几位(正负号不算),2代表小数后几位

  回答:

澳门金沙vip 17澳门金沙vip 18

  解决的方法有两种。第一种是用大对象类型,即CLOB或者BLOB类型,但是编程比较麻烦;第二种是用一对多的父子表实现。

======================================
        decimal[(m[,d])] [unsigned] [zerofill]
            准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

            特别的:对于精确数值计算时需要用此类型
                   decaimal能够存储精确值的原因在于其内部按照字符串存储。



======================================
        FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
            单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
                有符号:
                    -3.402823466E+38 to -1.175494351E-38,
                    1.175494351E-38 to 3.402823466E+38
                无符号:
                    1.175494351E-38 to 3.402823466E+38

            **** 数值越大,越不准确 ****


======================================
        DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
            双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

                有符号:
                    -1.7976931348623157E+308 to -2.2250738585072014E-308
                    2.2250738585072014E-308 to 1.7976931348623157E+308
                无符号:
                    2.2250738585072014E-308 to 1.7976931348623157E+308
            **** 数值越大,越不准确 ****