MySql Oracle SqlServer三大数据库的数据类型列表MySql数据类型Oracle数据类型一、概述在ORACLE8中定义了:标量(SCALAR)、复合(COMPOSITE)、引用(REFERENCE)和LOB四种数据类型,下面详细介绍它们的特性。
二、标量(SCALAR)合法的标量类型与数据库的列所使用的类型相同,此外它还有一些扩展。
它又分为七个组:数字、字符、行、日期、行标识、布尔和可信。
数字,它有三种基本类型--NUMBER、PLS_INTEGER和BINARY_INTENER。
NUMBER可以描述整数或实数,而PLS_INTEGER和BINARY_INTENER只能描述整数。
NUMBER,是以十进制格式进行存储的,它便于存储,但是在计算上,系统会自动的将它转换成为二进制进行运算的。
它的定义方式是NUMBER(P,S),P是精度,最大38位,S是刻度范围,可在-84...127间取值。
例如:NUMBER(5,2)可以用来存储表示-999.99...999.99间的数值。
P、S可以在定义是省略,例如:NUMBER(5)、NUMBER 等;BINARY_INTENER用来描述不存储在数据库中,但是需要用来计算的带符号的整数值。
它以2的补码二进制形式表述。
循环计数器经常使用这种类型。
PLS_INTEGER和BINARY_INTENER唯一区别是在计算当中发生溢出时,BINARY_INTENER型的变量会被自动指派给一个NUMBER型而不会出错,PLS_INTEGER型的变量将会发生错误。
字符,包括CHAR、VARCHAR2(VARCHAR)、LONG、NCHAR和NVARCHAR2几种类型。
CHAR,描述定长的字符串,如果实际值不够定义的长度,系统将以空格填充。
它的声明方式如下CHAR(L),L 为字符串长度,缺省为1,作为变量最大32767个字符,作为数据存储在ORACLE8中最大为2000。
VARCHAR2(VARCHAR),描述变长字符串。
它的声明方式如下VARCHAR2(L),L为字符串长度,没有缺省值,作为变量最大32767个字节,作为数据存储在ORACLE8中最大为4000。
在多字节语言环境中,实际存储的字符个数可能小于L值,例如:当语言环境为中文(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)时,一个VARCHAR2(200)的数据列可以保存200个英文字符或者100个汉字字符。
LONG,在数据库存储中可以用来保存高达2G的数据,作为变量,可以表示一个最大长度为32760字节的可变字符串。
NCHAR、NVARCHAR2,国家字符集,与环境变量NLS指定的语言集密切相关,使用方法和CHAR、VARCHAR2相同。
行,包括RAW和LONG RAW两种类型。
用来存储二进制数据,不会在字符集间转换。
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节。
日期,只有一种类型--DATE,用来存储时间信息,站用7个字节(从世纪到秒),绝对没有“千年虫”问题。
行标识,只有一种类型--ROWID,用来存储“行标识符”,可以利用ROWIDTOCHAR函数来将行标识转换成为字符。
布尔,只有一种类型--BOOLEAN,仅仅可以表示TRUE、FALSE或者NULL。
可信,只有一种类型--MLSLABEL,可以在TRUSTED ORACLE中用来保存可变长度的二进制标签。
在标准ORACLE 中,只能存储NULL值。
三、复合(COMPOSITE)标量类型是经过预定义的,利用这些类型可以衍生出一些复合类型。
主要有记录、表。
记录,可以看作是一组标量的组合结构,它的声明方式如下:TYPE record_type_name IS RECORD( filed1 type1 [NOT NULL] [:=expr1].......filedn typen [NOT NULL] [:=exprn] )其中,record_type_name是记录类型的名字。
(是不是看着象CREATE TABLE?......)引用时必须定义相关的变量,记录只是TYPE,不是VARIABLE。
表,不是物理存储数据的表,在这里是一种变量类型,也称为PL/SQL表,它类似于C语言中的数组,在处理方式上也相似。
它的声明方式如下:TYPE table_type_name IS TABLE OF scalar_type INDEX BY BINARY_INTENER;其中,table_type_name是类型的名字,scalar_type是一种标量类型的类型声明。
引用时也必须定义相关的变量。
表和数组不同,表有两列,KEY和VALUE,KEY就是定义时声明的BINARY_INTENER,VALUE就是定义时声明的scalar_type。
除了记录和表之外,还有对象类型、集合(嵌套表和VARRAYS)等类型,这些将专门讲解。
四、引用(REFERENCE)在PL/SQL8.0之前,只有一种类型--REF CURSOR,也就是游标。
它的定义较为简单,CURSOR cursor_name IS select .....from.....;在PL/SQL8.0之后,引入了REF类型,它指向一个对象。
这种类型将单独讲解。
(等我弄明白再说,免得在高人面前......)五、LOB型LOB变量主要是用来存储大量数据的数据库字段,最大可以存储4G字节的内容(这么大,存VCD?,浪费!)。
主要有:CLOB:和ORACLE7中的LONG类型相似,存储单字节字符数据。
(别用来存中文喔。
)NCLOB:用来存储定宽多字节字符数据。
(例如:存《啸傲江湖》就挺好)BLOB:和LONG RAW相似,用来存储无结构的二进制数据。
BFILE:它用来允许ORACLE对数据库外存储的大型二进制文本进行只读形式的访问。
六、其他其实在完成对标量变量的理解之后,基本上可以应付C/S模式下的常规数据库应用所需了,后续的类型说实话,我玩了5年ORACLE,都很少用到。
附:参考书《ORACLE8 PL/SQL程序设计》(《ORACLE8 PL/SQL PROGRAMMING》)ORACLE技术系列丛书机械工业出版社注:本文所列举的是PL/SQL当中可以定义的数据类型,并不是所有的类型都可以在建表时指定为列的数据类型SqlServer数据类型注意:SQL 数据类型JAVA数据类型CHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT BooleanTINYINT ByteSMALLINT ShortINTEGER IntBIGINT LongREAL FloatFLOAT DoubleDOUBLE DoubleBINARY byte[]VARBINARY byte[]LONGVARBINARY byte[]DATE java.sql.DateTIME java.sql.TimeTIMESTAMP java.sql.TimestampJAVA数据类型SQL 数据类型String VARCHAR or LONGVARCHAR java.math.BigDecimal NUMERIC Boolean BITByte TINYINTShort SMALLINTInt INTEGERLong BIGINTFloat REALDouble DOUBLEbyte[]VARBINARY or LONGVARBINARYjava.sql.Date DATEjava.sql.Time TIMEjava.sql.Timestamp TIMESTAMP这里,大伙要注意了,并不是所有的数据类型在各种数据库管理系统中都被支持。
下面,就几种常用的数据类型之间的转化进行说明:(1)CHAR, VARCHAR, 和 LONGVARCHAR在SQL语言中,有三种分别表示不同长度的字符类型CHAR, VARCHAR, 和LONGVARCHAR,在Java/Jsp中并没有相应的三种不同的数据类型与之一一对应,JDBC的处理方法是将其与String或者char[]对应起来。
在实际编程中不必对着三种SQL数据类型进行区分,全部将他们转化为Sting或者char[]就可以了。
而且通常使用应用的非常普遍的String类型。
我们还可以利用String类提供的方法将一个String对象转化为char[],或者用char[]为参数构造一个Stirng对象。
对于定长度的SQL数据类型CHAR(n),当从数据库管理系统中获得的结果集提取该类型的数据时,JDBC会为其构造一个长度为n的St ring对象来代表他,如果实际的字符个数不足’n’,系统会自动为String对象补上空格。
当向数据库管理系统写入的数据类型应该是CHAR(n)时,JDBC也会将该String对象的末尾补上相应数量的空格。
一般情况下,CHAR, VARCHAR, LONGVARCHAR和String之间可以无差错的进行转换。
但非常值得注意的是LONGVARCHAR,这种SQL的数据类型有时在数据库中代表的数据可能有几兆字节的大小,超过了String对象的承受范围。
JDBC解决的办法是用Jav a的Input Stream来接受这种类型的数据[以后我们回涉及到]。
Input Stream不仅支持ASCII,而且支持Unicode,我们可以根据需要进行选择。
(2)DECIMAL 和 NUMERICSQL的DECIMAL 和NUMERIC通常用来表示需要一定精度的定点数。
在Java的简单数据类型中,没有一种类型与之相对应。
但从JDK1.1开始,Sun公司在java.math.*包中加入了一个新的类BigDecimal,该类的对象可以与DECIMAL 、NUMERIC进行转换。
另外,当从数据库管理系统中读取数据时,还可以用getString()方法来获取DECIMAL 和 NUMERIC。
(3)BINARY, VARBINARY, 和 LONGVARBINARY在编程时无须精确区分这三种SQL数据类型,JDBC将他们统一影射为byte[]。
其中LONGVARBINARY和LONGVARCHAR相似,可以代表几兆字节的数据,超出数组的承受范围。
解决的办法依然是用Input Stream来接受数据。
(4)BIT代表一个二进制位的BIT类型被JDBC影射为boolean型。