Oracle-jdbc-java的类型映射
Oracle 8i 的类型映射
下表列出了⽤于 Oracle 8i 数据库的数据库类型和Java 类型之间的关系。
Java 数据类型JDBC 数据类型Oracle SQL 数据类型(8i 版)
boolean BIT NUMBER
byte TINYINT NUMBER
short SMALLINT NUMBER
int INTEGER NUMBER
long BIGINT NUMBER
double FLOAT NUMBER
float REAL NUMBER
double DOUBLE NUMBER
java.math.BigDecimal NUMERIC NUMBER
java.math.BigDecimal DECIMAL NUMBER
String CHAR CHAR
String VARCHAR VARCHAR2
String LONGVARCHAR LONG
java.sql.Date DATE DATE
java.sql.Time TIME DATE
java.sql.Timestamp TIMESTAMP DATE
byte[]BINARY NUMBER
byte[]VARBINARY RAW
byte[]LONGVARBINARY LONGRAW
java.sql.Blob BLOB BLOB
java.sql.Clob CLOB CLOB
====
Oracle 11g Datatypes
VARCHAR2(size [BYTE | CHAR])
可变长度的字符串的最⼤长度有⼤⼩字节或字符。最⼤尺⼨是4000字节或字符,最低为1个字节或1个字符。您必须指定VARCHAR2⼤⼩。
字节表⽰该列将有字节长度语义。 CHAR列表⽰将字符语义。
NVARCHAR2(size)
可变长度的Unicode字符串的最⼤长度有⼤⼩字符。的字节数可⾼达两倍的AL16UTF16编码与UTF8编码的三倍⼤⼩。最⼤尺⼨是由国家字符集的定义与4000字节的上限。您必须指定NVARCHAR2⼤⼩。
NUMBER [ (p [, s]) ]
数有精度p和规模秒该精度p的范围可以从1到38。在尺度s的范围可以从-84到127。精度和规模都在⼗进位数字。⼀个数字值,需要
从1到22字节。
FLOAT [(p)]
⼀个数字的数据类型具有精度第亚型float值的内部表⽰为NUMBER。该精度p的范围可以从1到126个⼆进制数字。 float值需要从1到22字节。
LONG
可变长度达2千兆字节或231字节的字符数据-1。为了向后兼容。
DATE
有效⽇期范围从1⽉1⽇,4712年,12⽉31⽇,9999 AD。默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的
NLS_TERRITORY参数。⼤⼩固定为7个字节。此数据类型包含⽇期时间字段年,⽉,⽇,⼩时,分和秒。它没有⼩数秒或时区。
BINARY_FLOAT
32位浮点数字。这种数据类型需要5个字节,包括长度字节。
BINARY_DOUBLE
64位浮点数字。这种数据类型需要9个字节,包括长度字节。
TIMESTAMP [(fractional_seconds_precision)]
64位浮点年,⽉,⽇的⽇期值,以及⼩时,分钟和秒钟的时间值,其中fractional_seconds_precision是数字中的第⼆号⽇期时间字段的⼩数部分。对fractional_seconds_precision可接受的值是0到9。默认是6。默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的NLS_TERRITORY参数。的⼤⼩不同的7⾄11个字节,取决于精度。此数据类型包含⽇期时间字段YEAR,MONTH,⽇,⼩时,分和秒。它包含⼩数秒,但没有⼀个时区。
TIMESTAMP [(fractional_seconds)] WITH TIME ZONE
时间戳以及时区位移值,其中fractional_seconds_precision是数字在第⼆⽇期时间字段的⼩数部分数字的所有值。可接受的值是0到9。默认是6。默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的NLS_TERRITORY参数。⼤⼩固定为13字节。此数据类型包含⽇期时间字段YEAR,MONTH,⽇,⼩时,分钟,秒TIMEZONE_HOUR和TIMEZONE_MINUTE。它有⼀个明确的分数秒和时区。
TIMESTAMP [(fractional_seconds)] WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情况除外:
数据标准化数据库的时区时,存储在数据库中。
当数据被检索,⽤户可以看到在会话时区中的数据。
默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的NLS_TERRITORY参数。的⼤⼩不同的7⾄11个字节,取决于精度。
INTERVAL YEAR [(year_precision)] TO MONTH
存储期间年数和⽉的时间,其中year_precision是数字的年份⽇期时间字段的数量。可接受的值是0到9。默认是2。⼤⼩固定为5个字节。
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]
存储⼀段时间以天,⼩时,分钟和秒,其中
day_precision是数字在DAY⽇期时间字段的最⼤数量。可接受的值是0到9。默认是2。
fractional_seconds_precision是数字中的第⼆个字段的⼩数部分的数量。可接受的值是0到9。默认是6。
⼤⼩固定为11个字节。
RAW(size)
长度字节⼤⼩的原始⼆进制数据。最⼤尺⼨为2000字节。您必须指定为原始值的⼤⼩。
LONG RAW
可变长度可达2吉字节的原始⼆进制数据。
ROWID
基地64字符串,表⽰在其表⾏的唯⼀地址。该数据类型主要是由ROWID伪返回的值。
UROWID [(size)]
基地64字符串代表⼀个索引组织表⾏的逻辑地址。可选的⼤⼩是⼀个类型UROWID列的⼤⼩。最⼤尺⼨和默认为4000字节。
CHAR [(size [BYTE | CHAR])]
长度⼤⼩字节或字符的固定长度的字符数据。最⼤尺⼨为2000字节或字符。默认和最⼩尺⼨为1字节。
BYTE和CHAR为VARCHAR2有相同的语义。
NCHAR[(size)]
长度⼤⼩字符的固定长度的字符数据。的字节数可⾼达两倍的AL16UTF16编码与UTF8编码的三倍⼤⼩。最⼤尺⼨是由国家字符集定义
与⼀个2000字节的上限。默认和最⼩尺⼨为1个字符。
CLOB
字符⼤对象,包含单字节或多字节字符。固定宽度和可变宽度的字符集的⽀持,⽆论是使⽤数据库的字符集。最⼤尺⼨是(4千兆字节 -1)*(数据库块⼤⼩)。
NCLOB
字符⼤对象,包含Unicode字符。固定宽度和可变宽度的字符集的⽀持,同时使⽤数据库国家字符集。最⼤尺⼨是(4千兆字节 - 1)*(数据库块⼤⼩)。国家字符集存储数据。
BLOB
⼆进制⼤对象。最⼤尺⼨是(4千兆字节 - 1)*(数据库块⼤⼩)。
BFILE
包含⼀个⼤的⼆进制⽂件存储在数据库以外的定位。启⽤字节流的I / O访问驻留在数据库服务器上的外部LOB的。最⼤尺⼨为4千兆字节。================
本概述是从《JDBC TM Database Access from Java TM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft ⽬前正在准备这本书。这本书是⼀本教程,同时也是 JDBC 的重要参考⼿册,它将作为 Java 系列的组成部份,在 1997 年春季由 Addison-Wesley 出版公司出版。
8.1 概述
由于 SQL 数据类型和 Java 数据类型是不同的,因此需要某种机制在使⽤ Java 类型的应⽤程序和使⽤ SQL 类型的数据库之间来读写数据。
为此,JDBC 提供了 getXXX 和 setXXX ⽅法集、⽅法 registerOutParameter 和类 Types。
本章汇集了影响各种类和接⼝的数据类型的有关信息,并列出所有的对应关系表(这些表显⽰了 SQL 类型和 Java 类型之间的映射关系)以便于参考。
8.2 将 SQL 数据类型映射为 Java 类型
不幸的是,不同数据库产品所⽀持的 SQL 类型之间有很⼤的不同。即使不同的数据库以相同的语义⽀持 SQL 类型,它们也可能⽤不同的名称。例如,绝⼤多数的主流数据库都⽀持⼀种表⽰⼤型⼆进制值的 SQL 类型,但 Oracle 把这种类型叫做 LONG RAW,Sybase 把它叫做 IMAGE,Informix 却把它叫做 BYTE,⽽ DB2 ⼜把它叫做 LONG VARCHAR FOR BIT DATA。
幸运的是,JDBC 程序员通常并不需要⾃⼰去关⼼⽬标数据库所⽤的实际 SQL 类型的名称。⼤多数时候,JDBC 程序员将根据⼀些现有的数据库表来进⾏编程。他们⽆须关⼼⽤于创建这些表的确切 SQL 类型的名称。
JDBC 在java.sql.Types 类中定义了⼀系列的常规 SQL 类型标识符。这些类型可⽤于表⽰那些最为常⽤的 SQL 类型。在⽤ JDBC API 编程时,程序员通常可以使⽤这些 JDBC 类型来引⽤⼀般的 SQL 类型,⽽⽆须关⼼⽬标数据库所⽤的确切 SQL 类型的名称。在下⼀节中将对这些 JDBC 类型进⾏仔细说明。
程序员⽤到 SQL 类型名称的主要地⽅是在⽤ SQL 的 CREATE TABLE 语句创建新的数据库表时。这种情况下,程序员必须注意应该使⽤⽬标数据库所⽀持的 SQL 类型名称。如果需要知道各种 SQL 类型在某个特定的数据库中的⾏为的确切定义,我们建议查阅⼀下数据库⽂档。
如果想要编写⼀种可在各种数据库上创建表的可移植 JDBC 程序,⽤户主要有两个选择。第⼀个选择是:限制⾃⼰只使⽤那些被⼴为接受的 SQL 类型名称(例如 INTEGER、NUMERIC 或VARCHAR)。这些类型有可能能适应所有的数据库。第⼆个选择是:
⽤ java.TypeInfo ⽅法来出给定的数据库实际上⽀持哪些 SQL 类型,然后选择与给定 JDBC 类型相匹配的特定于数据库的 SQL 类型名。
JDBC 定义了⼀个从 JDBC 数据库类型到 Java 类型的标准映射。例如,JDBC 的 INTEGER 类型通常映射为 Java 的 int 类型。这可⽀持简单的接⼝,将 JDBC 值读写为简单的 Java 类型。
Java 类型不必与 JDBC 类型完全形同;它们只须能够⽤⾜够的类型信息来代表 JDBC 类型,从⽽能正确地存储和取出参数和从 SQL 语句恢复结果就可以了。例如,Java String 对象可能并不能精确地与任何 JDBC CHAR 类型匹配,但它却可给出⾜够的类型信息来成功地表
⽰ CHAR、 VARCHAR 或 LONGVARCHAR 类型。
8.3 JDBC 类型
本节描述各种 JDBC 数据类型及其与标准 SQL 类型和 Java 类型的关联⽅式。
8.3.1 CHAR、 VARCHAR 和 LONGVARCHAR
JDBC 类型 CHAR、VARCHAR 和 LONGVARCHAR 密切相关。CHAR 表⽰固定长度的⼩字符串,VARCHAR 表⽰长度可变的⼩字符串,⽽ LONGVARCHAR 表⽰长度可变的⼤字符串。
与 JDBC CHAR 对应的是 SQL CHAR 类型,其定义由 SQL-92 给出,且所有主要的数据库都⽀持它。它接受⽤于指定字符串最⼤长度的参数,例如 CHAR(12) 即定义了⼀个长度为 12 个字符的字符串。所有主要的数据库都⽀持长度达 254 个字符的 CHAR。
与 JDBC VARCHAR 对应的是 SQL VARCHAR 类型,其定义由 SQL-92 给出,且所有的主要数据库
都⽀持它。它接受⽤于指定字符串最⼤长度的参数,例如 VARCHAR(12) 即定义了⼀个最⼤长度为 12 个字符的字符串。所有主要数据库都⾄少⽀持长度达 254 个字符
的 VARCHAR。当把字符串的值赋给 VARCHAR 变量时,数据库就记住该字符串的长度,使⽤ SELECT 时,它可以返回准确的原始字符串。
不幸的是,对于 JDBC LONGVARCHAR 类型,⽬前并没有⼀致的 SQL 映射。所有主要数据库都⽀持某种类型的长度可变的⼤字符串,这种字符串⽀持⾼达⼗亿位字节的数据,但 SQL 类型名称却变化多样。
Java 程序员不必区分 CHAR、VARCHAR 和 LONGVARCHAR 这三种类型的 JDBC 字符串。它们都可表⽰为 Java String,并且在不知道所需要的确切数据类型时也可正确读写 SQL 语句。
String 类能
使 String 和 char[] 之间的转换更为容易:它有⼀个⽤于将 String对象转换为 char[] 的⽅法,还有⼀个将 char[] 转换为 String 对象的构造函数。
必须提及的⼀个问题是:如何处理类型为 CHAR(n) 的固定长度的 SQL 字符串。答案是 JDBC 驱动程序(或 DBMS)将⽤适当的空格来进⾏填补。因此,当从数据库中检索 CHAR(n) 域时,驱动程序将把它转换为长度为 n 的 Java String 对象,对象末尾可能含有⼀些填补空格。反之,当把 String 对象送到某个 CHAR(n) 域时,驱动程序和/或数据库将在字符串的末尾填上⼀些必要的空格,使字符串的长度达
到 n。
⽅法 String ⽤于分配和返回新的 String 对象。我们建议⽤它来从 CHAR、VARCHAR 和LONGVARCHAR 域中检索数据。它适⽤于检索普通的数据,但如果⽤ JDBC 类型LONGVARCHAR 来储存多个兆字节的字符串时,⽤它进⾏检索将显得⼗分笨拙。为
此,ResultSet 接⼝中有两个⽅法可供程序员将 LONGVARCHAR 值作为 Java 输⼊流进⾏检索,之后可从该流中以任意⼤⼩的块来读取数据。这两个⽅法是:getAsciiStream 和 getUnicodeStream,它们将把储存在 LONGVARCHAR 列的数据作为 Ascii 或 Unicode 字符流来传送。
8.3.2 BINARY、VARBINARY 和 LONGVARBINARY
JDBC 类型 BINARY、VARBINARY 和 LONGVARBINARY 密切相关。BINARY 表⽰固定长度的⼩⼆
进制值, VARBINARY 表⽰长度可变化的⼩⼆进制值,⽽ LONGVARBINARY 表⽰长度可变化的⼤⼆进制值。
不幸的是,这些不同 BINARY 类型的使⽤还未被标准化,因⽽在各种主要数据库提供的⽀持有很⼤的不同。
对应于 JDBC BINARY 类型的 SQL BINARY 类型,是⼀种⾮标准的 SQL 扩展,只在某些数据库上才实现。它接受⽤于指定⼆进制字节数的参数。例如,BINARY(12) 即定义了⼀个长度为 12 个字节的 binary 类型。通常,BINARY 值被限定在 254 个字节以内。
对应于 JDBC VARBINARY 类型的 SQL VARBINARY 类型,是⼀种⾮标准的 SQL 扩展,只在某些数据库上才实现。它接受⽤于指定⼆进制字节最⼤数的参数。例如,VARBINARY(12) 即定义了⼀个长度最⼤可为 12 个字节的⼆进制类型。通常,VARBINARY 的值被限定在254 个字节以内。当把⼆进制的值赋给 VARBINARY 变量时,数据库就记住这个所赋值的长度,调⽤ SELECT时,它返回准确的原始值。
遗憾的是,⽬前还没有⼀致的 SQL 类型名称与 JDBC LONGVARBINARY 类型相对应。所有主要数据库都⽀持某种类型的长度可变的⼤⼆进制类型,它可⽀持⾼达⼗亿个字节的数据,但 SQL 类型名称却变化多样。
BINARY 数据类型的情况下正确地读写 SQL 语句,因此,Java 程序员⽆需区分它们。
检索 BINARY 和 VARBINARY 值时,我们建议使⽤ Bytes。然⽽,如果类型为 JDBC LONGVARBINARY 的某列储存的是⼏兆字节长度的字节数组,则建议⽤⽅法getBinaryStream 来检索。与 LONGVARCHAR 的情形类似,该⽅法可以使 Java 程序员
将 LONGVARBINARY 值作为 Java 输⼊流检索,然后可从该流中以更⼩的块来读取。
8.3.3 BIT
JDBC 类型 BIT 代表⼀个位值,可为 0 或 1。SQL-92 定义了 SQL BIT 类型。但与 JDBC BIT 类型不同,这种 SQL-92 BIT 类型带参数,⽤于定义固定长度的⼆进制字符串。幸运的是,SQL-92 也允许⽤简单的⾮参数化的 BIT 类型来代表单个的⼆进制数字。这种⽤法对应于 JDBC BIT 类型。不幸的是,SQL-92 BIT 类型只有在 “完全” SQL-92 中才要求,且⽬前只有⼀部份主流数据库⽀持它。因此,可移植的代码也许宁愿⽤ JDBC SMALLINT 类型,这种类型已得到⼴泛⽀持。
8.3.4 TINYINT
JDBC 类型 TINYINT 代表⼀个 8 位⽆符号整数,其值在 0 到 255 之间。
对应的 SQL 类型 TINYINT ⽬前只有⼀部份的数据库⽀持它。因此,可移植的代码也许宁愿⽤ JDBC SMALLINT 类型,这种类型已得到⼴泛⽀持。
JDBC TINYINT 类型的 Java 映射的推荐类型是 Java byte 或 Java short。8 位的 Java byte 类型代表⼀个有符号的整数,其值在 -128 到127 之间,因此对于⼤的 TINYINT 值它并⾮总合适,⽽ 16 位的 Java short 类型却总能存储所有的 TINYINT 值。
8.3.5 SMALLINT
JDBC 类型 SMALLINT 代表⼀个 16 位的有符号整数,其值在 -32768 和 32767 之间。
对应的 SQL 类型 SMALLINT,其定义由 SQL- 92 给出,并为所有主流数据库所⽀持。SQL-92 标准将 SMALLINT 的精度留给实现去决定。但事实上,所有的主流数据库都⾄少⽀持 16 位。
8.3.6 INTEGER
oracle decimal类型JDBC 类型 INTEGER 代表⼀个 32 位的有符号整数,其值在 - 2147483648 和 2147483647 之间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论