- 浏览: 494810 次
- 性别:
- 来自: OnePiece
文章分类
- 全部博客 (196)
- --------- 基础----------- (0)
- java 碎碎念 (12)
- java 并行编程 (11)
- java I/O (6)
- java Charset & Encoding (2)
- spring学习笔记 (8)
- 正则表达式 (5)
- web前端-javascript (11)
- web前端-jQuery (7)
- web前端-碎碎念 (1)
- mybatis (0)
- 数据库-通用 (8)
- 数据库-oracle (20)
- nosql-redis (11)
- nosql-mongoDB (1)
- xml (2)
- log4j (2)
- uml (3)
- web services: soap/wsdl (6)
- soa-tuscany (2)
- linux (6)
- ----------修养----------- (0)
- 深入理解java虚拟机 (7)
- java 设计模式 (9)
- 数据结构和算法 (2)
- 读书笔记--代码整洁之道 (2)
- 计算机基础 (1)
- -----------践行---------- (0)
- 重构(refactor) (7)
- jvm-诊断 (4)
- 数据库-让oracle跑得更快 (7)
- Nginx (6)
- ehcache (2)
- 短信开发 (1)
- Servlet+Filter+Listener (2)
- 运维 (6)
- 问题记录 (38)
- 杂七杂八 (12)
最新评论
-
zhanggang807:
第二种方法比较好
<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext() -
assasszt:
谢谢分享,很清楚的讲明了原理。
字符集与字符编码简介 -
su0nils000:
难得的笔记
<进阶-2> 打造高效正则表达式 -
足至迹留:
mini188 写道用MD5来解决碰撞是不是也是可行的呢?个人 ...
Hash简介 -
mini188:
用MD5来解决碰撞是不是也是可行的呢?
Hash简介
选择一个正确的数据类型,这看上去再容易不过了,但屡屡发生选择不当的情况。选择适当的数据类型至关重要,而且很难事后再做改变。
11.1 oracle数据类型概述
Oracle提供了22种不同的sql数据类型。
(1) char:这是一个定长字符串,会用空格填充来达到其最大长度。非null的char(10)总是包含10字节信息(使用了默认国家语言支持,NLS,设置)。char字段最多可以存储2000字节的信息。
(2) nchar:这是一个包含unicode格式数据的定长字符串。Unicode是一种字符串编码规范。非null的nchar(10)总是包含10个字符的信息。Nchar字段最多可以存储2000字节的信息。
(3) varchar2:目前这也是varchar的同义词。这是一个变长字符串,与char类型不同,它不会用空格填充至最大长度。Varchar2(10)可能包含0~10字节的信息(使用默认NLS设置)。varchar2最多可以存储4000字节的信息。
(4) nvarchar2:这是一个包含unicode格式数据的变长字符串。Nvarchar2(10)可以包含0~10个字符信息。Nvarchar2最多可以存储4000字节的信息。
(5) raw: 这是一种变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。可以把它看做由数据库存储的信息的二进制字节串。这种类型最多可以存储2000字节的信息。
(6) number:这种数据类型能存储精度最多达38位的数字。每个数存储在一个变长字段中,其长度在0~22字节之间。Oracle的number类型精度很高,远远高于许多编程语言中的float和double类型。
(7) binary_float:这时oracle 10g release 1及以上版本中才有的一种新类型。他是一个32位单精度浮点数,可以支持至少6位精度,占用磁盘上5字节的存储空间。
(8) binary_double:这是一种oracle 10g release1及以上版本中才有的新类型。它是一个64位双精度浮点数,可以支持至少13位精度,占用磁盘上9字节的存储空间。
(9) long: 这种类型能存储最多2GB的字符数据。由于long类型有许多限制,而且提供long类型只是为了保证向后兼容,所以强烈建议新应用中不要使用long类型。而且现有的应用中也要尽可能将long类型转换为clob类型。
(10) long raw:这种类型最多能存储2GB的二进制信息。由于long同样的原因,建议在将来所有开发中都使用Blob类型,另外现有的应用中也尽可能将long raw转换为blob类型。
(11) date: 这是一个7字节的定宽日期/时间数据类型。其中总包含7个属性,世纪,世纪中哪一年,月份,月中的哪一天,小时,分钟和秒。
(12) [b]timestamp[/b]:这是一个7字节或11字节的定宽日期/时间数据类型。它与date数据类型不同,因为timestamp可以包含小数秒,带小数秒的timestamp在小数点右边最多可以保留9位。
(13) timestamp with time zone:与前一种类型类似,这是一个13字节的定宽timestamp,不过它还提供了时区(time zone)支持。数据中会随timestamp存储关于时区的额外信息,所以原先插入的time zone会与数据一同保留。
(14) timestamp with local time zone: 与timestamp类似,这是一种7字节或11字节的定宽日期/时间数据类型。不过,这种类型对时区敏感。如果在数据库中有修改,会参考数据中提供的timezone,根据数据库时区对数据中的日期/时间部分进行规范化。
(15) interval year to month: 这是一个5字节的定宽数据类型。用于存储一个时段,这个类型将时段存储为年数和月数。可以再日期运算中使用这种时间间隔使一个date或timestamp类型增加或减少一段时间。
(16) interval day to second: 这是一个11字节的定宽数据类型,用于存储一个时段,这个类型将时段存储为天/小时/分钟/秒数, 还可以有最多9位小数秒。
(17) Bfile:这种数据类型允许在数据库列中存储一个oracle目录对象和一个文件名,并读取这个文件。这实际上允许你以一种只读的方式访问数据库服务器上可用的操作系统文件,这好像他们存储在数据库表本身中一样。
(18) Blob:在oracle 9i及以前的版本中,这种数据类型允许存储最多4GB数据,在oracle 10g及以上的版本中允许存储最多4GB * 10(数据库块大小)字节的数据。Blob包含不需要进行字符集转换的二进制数据,如果要存储电子表格,字处理文档,图像文件等就很适合采用这种数据类型。
(19) Clob: 在oracle 9i及以前的版本中,这种数据类型允许存储最多4GB的数据,在oracle 10g及以上的版本中允许存储最多4GB*10(数据库块大小)字节的数据。Clob包含要进行字符集转换的信息。这种数据类型很适合存储大块纯文本信息。如果你的纯文本只有4000字节或更少,那么这种数据类型并不适用,varchar2数据类型就够用了。
(20) Nclob: 在oracle 9i及以前的版本中这种数据类型允许存储最多4GB的数据,在oracle 10g及以上的版本中允许存储最多4GB * 10(数据库块大小)字节的数据。NCLOB存储用数据库国家字符集编码的信息,而且像CLOB一样,这些信息要进行字符集转换。
(21) Rowid:rowed实际上是数据库中一行的10字节地址。Rowid中编码有足够的信息,足以在磁盘上定位这一行,以及标识rowid指向的对象。
(22) Urowid: urowid是一个通用rowid,用于表(如IOT和通过异构数据库网关访问的没有固定rowid的表)。Urowid是行主键值的一种表示。因此,取决于所指向的对象,urowid的大小很有所变化。
11.2 字符和二进制串类型
11.2.1 NLS概述
NLS代表国家语言支持(national language support)。NLS是数据库的一个非常强大的特性,但是人们往往未能正确理解这个特性。NLS控制着数据的许多方面。例如,它控制着数据如何存储;我们在数据库中会看到多个逗号和一个点号(如1,000,000,000.01)还是看到多个点号和一个逗号(如1.000.000,01)。但是最重要的是它控制着以下两个方面:
(1) 文本数据持久存储在磁盘上时如何编码。
(2) 透明地将数据从一个字符集转换到另一个字符集。
11.2.2 字符串
Oracle中有4种基本的字符串类型,分别是char, varchar2, nchar和nvarchar2。在oracle中,所有串都以同样的格式存储。在数据库块上,最前面都有一个1-3字节的长度字段,其后才是数据。如果数据为null, 长度字段则表示为一个单字节oxFF。Tom说到,从来没有见过哪个应用适合使用char类型。因为char总是会用空格来填充得到的串,使之达到一个固定宽度,不论是表段还是索引段中,char都会占用最大的存储空间。除此之外,还有绑定变量问题。所以,无论什么场合都要避免使用char类型。即使对于单字符的字符字段也是如此。
Char和varchar2类型支持两种指定长度的方法。
(1) 用字节指定:varchar2(10 byte)。这能支持最多10字节的数据,在一个多字节字符集中,这可能只是两个字符。
(2) 用字符指定:varchar2(10 char)。这将支持最多10字符的数据,可能是多达40字节的信息。另外,varchar2(4000 char)理论上最多支持4000个字符的数据,不过由于oracle中字符串数据类型限制为4000字节,所以可能无法得到全部4000个字符。如果后面不带类型,一般默认是字节,使用utf8之类的多字节字符集时,建议使用char修饰符。
11.3 二进制串: raw类型
Oracle除了支持文本,还支持二进制数据的存储。前面讨论的char和varchar2类型需要进行字符集转换,而二进制数据不会做这种字符集转换。因此,二进制数据类型不适合存储用户提供的文本,而适于存储加密信息,加密数据不是文本,而是原文本的一个二进制表示,包括二进制标记信息的字处理文档等等。
Oracle支持下面3种数据类型来存储二进制数据。
(1) raw类型,它很适合存储多达2000字节的raw数据。
(2) blob类型,它支持更大的二进制数据。
(3) long raw类型,这是为支持向后兼容性提供的,新应用不应考虑使用这个类型。
从磁盘上的存储来看,raw类型与varchar2类型很相似。Raw类型是一个变长的二进制串。Raw类型可以加索引,还能在谓词中使用,它与其他任何类型有同样的功能。不过,必须当心避免不希望的隐式转换,而且必须知道确实会发生隐式转换。推荐使用显示转换,可以使用以下内置函数来执行这种操作。
(1) hextoraw: 将16禁止字符串转换为raw类型。
(2) rawtohex: 将raw串转换为16进制串。
Sql*plus将raw类型获取为一个串时,会隐式调用rawtohex函数,而插入串时会隐式调用hextoraw函数。应该避免隐式转换,而在编写代码时总是使用显式转换:
11. 4 数值类型
Oracle 10g及以上版本支持3种固有数据类型来存储数值。Oracle 9i release2及以前的版本只支持一种适合存储数值数据的固有数据类型。以下所列的数据类型中,number类型在所有oracle版本中都得到支持,后两种类型是新的数据类型。
(1) number: oracle number类型能以极大的精度存储数值,具体来讲,精度可达38位。Number类型是一种变长格式,长度为0-22字节。这是目前最为常用的数值类型。
(2) binary_float:这是一种IEEE固有的单精度浮点数。它在磁盘上会占用5字节的存储空间,其中4个固定字节用于存储浮点数,另外还有一个长度字节。Binary_float能存储6位精度的数值。
(3) binary_double: 这是一种IEEE固有的双精度浮点数。它在磁盘上会占用9字节的存储空间。其中8个固定字节用于存储浮点数,还有一个长度字节。Binary_double能存储13位精度的数值。
11.4.1 number类型的语法和用法
number类型的语法很简单:
在此p和s都是可选的,用于指定:
(1) 精度(precision),或总位数。默认情况下,精度为38位。
(2) 小数位数(scale),或小数点右边的位数。小数位数的合法值为-84~127,其默认值取决于是否指定了精度。如果没有指定精度,小数位数则默认有最大的取值区间;如果指定了精度,小数位数默认为0。允许小数位数为-84~127看起来很奇怪,为什么小数位数可以是负值?其作用是允许对小数点左边的值舍入。就像number(5,2)将值舍入为最接近的0.01一样,number(5, -2)会把数值舍入为与之最接近的100.
11.4.2 非固有数值类型
除number, binary_float和binary_double类型,oracle在语法上(指的是在create时可以使用这些数据类型,但是底层实际上存储时都只是number类型)还支持以下数值数据类型。
(1) numeric(p, s):完全映射至number(p, s)。
(2) decimal(p, s): 完全映射至number(p, s)。
(3) integer或int:完全映射至number(38)类型。
(4) float(p): 映射至number类型。
(5) double precision: 映射至number类型。
(6) real: 映射至bumber类型。
11.4.3 性能考虑
一般而言,oracle number类型对大多数应用来讲都是最佳的选择。不过,这个类型会带来一些性能影响。Number类型是一种软件数据类型,在oracle软件本身中实现。我们不能使用固有硬件操作将两个number相加。不过,浮点数没有这种实现。将两个浮点数相加时,oracle会使用硬件来执行运算。性能可以相差几十倍。
但是,浮点数是数值的一个近似值,精度在6-13位之间。从number类型得到的答案比从浮点数得到的答案精确的多。但是,如果你在对科学数据执行数据挖掘或复杂的数值计算,这种精度损失往往是可以接受的,另外可能会得到非常显著的性能提升。
需要注意的是,我们可以鱼和熊掌兼得。通过使用内置的cast函数,可以对oracle number类型执行一种实时的转换,在对其进行复杂的数学运算之前先将其转换为一种浮点数类型。这样一来,所用的cpu时间就与使用固有浮点数类型所用的cpu时间非常接近,同时也达到了精确地存储数据:
Select sum(ln(cast(num_type as binary_double))) from t;
11.5 date, timestamp 和 interval类型
Oracle固有数据类型date, timestamp和interval是紧密相关的。Date和timestamp类型存储精度可变的固定日期/时间。Interval类型可以很容易存储一个时间量,如“8个小时”或“30天”。将两个时间戳相减就得到一个时间间隔。
11.5.1 格式
关于格式,建议就是:应该明确使用格式。将一个表示date,timestamp或interval的串发送到数据库时就可以使用格式。不要依赖于默认的日期格式,默认格式会在将来某个时刻被另外某个人所修改。
处于安全性考虑,如果没有一个明确的格式,永远不要使用to_char/to_date。没有人知道’01-02-03’究竟表示哪一天。
考虑一下insert语句,它依赖于一个默认的日期掩码:
Insert into t (date_column) values(‘01/02/03’);
这个insert最好写作:
Insert into t(date_column) values(to_date(‘01/02/03’, ‘DD/MM/YY’));
但最好的做法是:
Insert into t(date_column) values(to_date(‘01/02/03’, ‘DD/MM/YYYY’));
也就是必须使用一个4字符的年份。
11.5.2 date类型
Date类型是一个7字节的定宽日期/时间数据类型。它总是包含7个属性,包括:世纪,世纪中哪一年,月份,月中的哪一天,小时,分钟和秒。Oracle使用一种内部格式来表示这个信息,使用内置dump函数可以看到oracle实际存储的内容。
1. 向date增加或减去时间
常用的技术有3种:
(1) 向date增加一个number,把date加1是增加1天的一种方法,因此,向date增加1/24就是增加1个小时,依次类推。
(2) 使用interval类型来增加事件单位。Interval类型支持两种粒度:年和月,或日/小时/分钟/秒。也就是说,可以是几年和几个月的一个时间间隔,也可以是几天,几小时,几分钟和几秒的一个时间间隔。
[b](3) 使用内置的add_month函数增加月。[/b]由于增加一个月往往不像增加28-31天那么简单,为了便于增加月,专门实现了这样一个函数。
总的来讲,使用oracle date类型时,建议:
(1) 使用numtodsinterval内置函数来增加小时、分钟和秒。
(2) 加一个简单的数来增加天
(3) 使用add_months内置函数增加月和年。
2. 得到两个日期之差
只是把两个日期相减,会返回表示两个日期相隔天数的一个数;另外,还可以使用内置函数months_between,它会返回表示两个日期相隔月数的一个数(包括月小数);最后,还可以利用interval类型,使用numtodsinterval或numtoyminterval等内置函数。
11.5.3 timestamp类型
Timestamp类型与date非常类似,只不过另外还支持小数秒和时区。
1. Timestamp
基本timestamp数据类型语法很简单:
Timestamp(n)
这里n是可选的,用于指定timestamp中秒分量的小数单位,可以取值为0-9。如果指定0,timestamp在功能上则与data等价,他们实际上会以同样的方式存储相同的值。
2. 向timestamp增加或减去时间
Date执行日期算术运算所用的技术同样适用于timestamp,但是使用上述技术的很多情况下,timestamp会转换为一个date.
3. 得到两个timestamp之差
这正是date和timestamp类型存在显著差异的地方。尽管将date相减的结果是一个number,但timestamp相减的结果却是一个interval.
11.1 oracle数据类型概述
Oracle提供了22种不同的sql数据类型。
(1) char:这是一个定长字符串,会用空格填充来达到其最大长度。非null的char(10)总是包含10字节信息(使用了默认国家语言支持,NLS,设置)。char字段最多可以存储2000字节的信息。
(2) nchar:这是一个包含unicode格式数据的定长字符串。Unicode是一种字符串编码规范。非null的nchar(10)总是包含10个字符的信息。Nchar字段最多可以存储2000字节的信息。
(3) varchar2:目前这也是varchar的同义词。这是一个变长字符串,与char类型不同,它不会用空格填充至最大长度。Varchar2(10)可能包含0~10字节的信息(使用默认NLS设置)。varchar2最多可以存储4000字节的信息。
(4) nvarchar2:这是一个包含unicode格式数据的变长字符串。Nvarchar2(10)可以包含0~10个字符信息。Nvarchar2最多可以存储4000字节的信息。
(5) raw: 这是一种变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。可以把它看做由数据库存储的信息的二进制字节串。这种类型最多可以存储2000字节的信息。
(6) number:这种数据类型能存储精度最多达38位的数字。每个数存储在一个变长字段中,其长度在0~22字节之间。Oracle的number类型精度很高,远远高于许多编程语言中的float和double类型。
(7) binary_float:这时oracle 10g release 1及以上版本中才有的一种新类型。他是一个32位单精度浮点数,可以支持至少6位精度,占用磁盘上5字节的存储空间。
(8) binary_double:这是一种oracle 10g release1及以上版本中才有的新类型。它是一个64位双精度浮点数,可以支持至少13位精度,占用磁盘上9字节的存储空间。
(9) long: 这种类型能存储最多2GB的字符数据。由于long类型有许多限制,而且提供long类型只是为了保证向后兼容,所以强烈建议新应用中不要使用long类型。而且现有的应用中也要尽可能将long类型转换为clob类型。
(10) long raw:这种类型最多能存储2GB的二进制信息。由于long同样的原因,建议在将来所有开发中都使用Blob类型,另外现有的应用中也尽可能将long raw转换为blob类型。
(11) date: 这是一个7字节的定宽日期/时间数据类型。其中总包含7个属性,世纪,世纪中哪一年,月份,月中的哪一天,小时,分钟和秒。
(12) [b]timestamp[/b]:这是一个7字节或11字节的定宽日期/时间数据类型。它与date数据类型不同,因为timestamp可以包含小数秒,带小数秒的timestamp在小数点右边最多可以保留9位。
(13) timestamp with time zone:与前一种类型类似,这是一个13字节的定宽timestamp,不过它还提供了时区(time zone)支持。数据中会随timestamp存储关于时区的额外信息,所以原先插入的time zone会与数据一同保留。
(14) timestamp with local time zone: 与timestamp类似,这是一种7字节或11字节的定宽日期/时间数据类型。不过,这种类型对时区敏感。如果在数据库中有修改,会参考数据中提供的timezone,根据数据库时区对数据中的日期/时间部分进行规范化。
(15) interval year to month: 这是一个5字节的定宽数据类型。用于存储一个时段,这个类型将时段存储为年数和月数。可以再日期运算中使用这种时间间隔使一个date或timestamp类型增加或减少一段时间。
(16) interval day to second: 这是一个11字节的定宽数据类型,用于存储一个时段,这个类型将时段存储为天/小时/分钟/秒数, 还可以有最多9位小数秒。
(17) Bfile:这种数据类型允许在数据库列中存储一个oracle目录对象和一个文件名,并读取这个文件。这实际上允许你以一种只读的方式访问数据库服务器上可用的操作系统文件,这好像他们存储在数据库表本身中一样。
(18) Blob:在oracle 9i及以前的版本中,这种数据类型允许存储最多4GB数据,在oracle 10g及以上的版本中允许存储最多4GB * 10(数据库块大小)字节的数据。Blob包含不需要进行字符集转换的二进制数据,如果要存储电子表格,字处理文档,图像文件等就很适合采用这种数据类型。
(19) Clob: 在oracle 9i及以前的版本中,这种数据类型允许存储最多4GB的数据,在oracle 10g及以上的版本中允许存储最多4GB*10(数据库块大小)字节的数据。Clob包含要进行字符集转换的信息。这种数据类型很适合存储大块纯文本信息。如果你的纯文本只有4000字节或更少,那么这种数据类型并不适用,varchar2数据类型就够用了。
(20) Nclob: 在oracle 9i及以前的版本中这种数据类型允许存储最多4GB的数据,在oracle 10g及以上的版本中允许存储最多4GB * 10(数据库块大小)字节的数据。NCLOB存储用数据库国家字符集编码的信息,而且像CLOB一样,这些信息要进行字符集转换。
(21) Rowid:rowed实际上是数据库中一行的10字节地址。Rowid中编码有足够的信息,足以在磁盘上定位这一行,以及标识rowid指向的对象。
(22) Urowid: urowid是一个通用rowid,用于表(如IOT和通过异构数据库网关访问的没有固定rowid的表)。Urowid是行主键值的一种表示。因此,取决于所指向的对象,urowid的大小很有所变化。
11.2 字符和二进制串类型
11.2.1 NLS概述
NLS代表国家语言支持(national language support)。NLS是数据库的一个非常强大的特性,但是人们往往未能正确理解这个特性。NLS控制着数据的许多方面。例如,它控制着数据如何存储;我们在数据库中会看到多个逗号和一个点号(如1,000,000,000.01)还是看到多个点号和一个逗号(如1.000.000,01)。但是最重要的是它控制着以下两个方面:
(1) 文本数据持久存储在磁盘上时如何编码。
(2) 透明地将数据从一个字符集转换到另一个字符集。
11.2.2 字符串
Oracle中有4种基本的字符串类型,分别是char, varchar2, nchar和nvarchar2。在oracle中,所有串都以同样的格式存储。在数据库块上,最前面都有一个1-3字节的长度字段,其后才是数据。如果数据为null, 长度字段则表示为一个单字节oxFF。Tom说到,从来没有见过哪个应用适合使用char类型。因为char总是会用空格来填充得到的串,使之达到一个固定宽度,不论是表段还是索引段中,char都会占用最大的存储空间。除此之外,还有绑定变量问题。所以,无论什么场合都要避免使用char类型。即使对于单字符的字符字段也是如此。
Char和varchar2类型支持两种指定长度的方法。
(1) 用字节指定:varchar2(10 byte)。这能支持最多10字节的数据,在一个多字节字符集中,这可能只是两个字符。
(2) 用字符指定:varchar2(10 char)。这将支持最多10字符的数据,可能是多达40字节的信息。另外,varchar2(4000 char)理论上最多支持4000个字符的数据,不过由于oracle中字符串数据类型限制为4000字节,所以可能无法得到全部4000个字符。如果后面不带类型,一般默认是字节,使用utf8之类的多字节字符集时,建议使用char修饰符。
11.3 二进制串: raw类型
Oracle除了支持文本,还支持二进制数据的存储。前面讨论的char和varchar2类型需要进行字符集转换,而二进制数据不会做这种字符集转换。因此,二进制数据类型不适合存储用户提供的文本,而适于存储加密信息,加密数据不是文本,而是原文本的一个二进制表示,包括二进制标记信息的字处理文档等等。
Oracle支持下面3种数据类型来存储二进制数据。
(1) raw类型,它很适合存储多达2000字节的raw数据。
(2) blob类型,它支持更大的二进制数据。
(3) long raw类型,这是为支持向后兼容性提供的,新应用不应考虑使用这个类型。
从磁盘上的存储来看,raw类型与varchar2类型很相似。Raw类型是一个变长的二进制串。Raw类型可以加索引,还能在谓词中使用,它与其他任何类型有同样的功能。不过,必须当心避免不希望的隐式转换,而且必须知道确实会发生隐式转换。推荐使用显示转换,可以使用以下内置函数来执行这种操作。
(1) hextoraw: 将16禁止字符串转换为raw类型。
(2) rawtohex: 将raw串转换为16进制串。
Sql*plus将raw类型获取为一个串时,会隐式调用rawtohex函数,而插入串时会隐式调用hextoraw函数。应该避免隐式转换,而在编写代码时总是使用显式转换:
Select rawtohex(raw_data) from t; Insert into t values(hextoraw(‘abcdef’));
11. 4 数值类型
Oracle 10g及以上版本支持3种固有数据类型来存储数值。Oracle 9i release2及以前的版本只支持一种适合存储数值数据的固有数据类型。以下所列的数据类型中,number类型在所有oracle版本中都得到支持,后两种类型是新的数据类型。
(1) number: oracle number类型能以极大的精度存储数值,具体来讲,精度可达38位。Number类型是一种变长格式,长度为0-22字节。这是目前最为常用的数值类型。
(2) binary_float:这是一种IEEE固有的单精度浮点数。它在磁盘上会占用5字节的存储空间,其中4个固定字节用于存储浮点数,另外还有一个长度字节。Binary_float能存储6位精度的数值。
(3) binary_double: 这是一种IEEE固有的双精度浮点数。它在磁盘上会占用9字节的存储空间。其中8个固定字节用于存储浮点数,还有一个长度字节。Binary_double能存储13位精度的数值。
11.4.1 number类型的语法和用法
number类型的语法很简单:
number(p, s)
在此p和s都是可选的,用于指定:
(1) 精度(precision),或总位数。默认情况下,精度为38位。
(2) 小数位数(scale),或小数点右边的位数。小数位数的合法值为-84~127,其默认值取决于是否指定了精度。如果没有指定精度,小数位数则默认有最大的取值区间;如果指定了精度,小数位数默认为0。允许小数位数为-84~127看起来很奇怪,为什么小数位数可以是负值?其作用是允许对小数点左边的值舍入。就像number(5,2)将值舍入为最接近的0.01一样,number(5, -2)会把数值舍入为与之最接近的100.
11.4.2 非固有数值类型
除number, binary_float和binary_double类型,oracle在语法上(指的是在create时可以使用这些数据类型,但是底层实际上存储时都只是number类型)还支持以下数值数据类型。
(1) numeric(p, s):完全映射至number(p, s)。
(2) decimal(p, s): 完全映射至number(p, s)。
(3) integer或int:完全映射至number(38)类型。
(4) float(p): 映射至number类型。
(5) double precision: 映射至number类型。
(6) real: 映射至bumber类型。
11.4.3 性能考虑
一般而言,oracle number类型对大多数应用来讲都是最佳的选择。不过,这个类型会带来一些性能影响。Number类型是一种软件数据类型,在oracle软件本身中实现。我们不能使用固有硬件操作将两个number相加。不过,浮点数没有这种实现。将两个浮点数相加时,oracle会使用硬件来执行运算。性能可以相差几十倍。
但是,浮点数是数值的一个近似值,精度在6-13位之间。从number类型得到的答案比从浮点数得到的答案精确的多。但是,如果你在对科学数据执行数据挖掘或复杂的数值计算,这种精度损失往往是可以接受的,另外可能会得到非常显著的性能提升。
需要注意的是,我们可以鱼和熊掌兼得。通过使用内置的cast函数,可以对oracle number类型执行一种实时的转换,在对其进行复杂的数学运算之前先将其转换为一种浮点数类型。这样一来,所用的cpu时间就与使用固有浮点数类型所用的cpu时间非常接近,同时也达到了精确地存储数据:
Select sum(ln(cast(num_type as binary_double))) from t;
11.5 date, timestamp 和 interval类型
Oracle固有数据类型date, timestamp和interval是紧密相关的。Date和timestamp类型存储精度可变的固定日期/时间。Interval类型可以很容易存储一个时间量,如“8个小时”或“30天”。将两个时间戳相减就得到一个时间间隔。
11.5.1 格式
关于格式,建议就是:应该明确使用格式。将一个表示date,timestamp或interval的串发送到数据库时就可以使用格式。不要依赖于默认的日期格式,默认格式会在将来某个时刻被另外某个人所修改。
处于安全性考虑,如果没有一个明确的格式,永远不要使用to_char/to_date。没有人知道’01-02-03’究竟表示哪一天。
考虑一下insert语句,它依赖于一个默认的日期掩码:
Insert into t (date_column) values(‘01/02/03’);
这个insert最好写作:
Insert into t(date_column) values(to_date(‘01/02/03’, ‘DD/MM/YY’));
但最好的做法是:
Insert into t(date_column) values(to_date(‘01/02/03’, ‘DD/MM/YYYY’));
也就是必须使用一个4字符的年份。
11.5.2 date类型
Date类型是一个7字节的定宽日期/时间数据类型。它总是包含7个属性,包括:世纪,世纪中哪一年,月份,月中的哪一天,小时,分钟和秒。Oracle使用一种内部格式来表示这个信息,使用内置dump函数可以看到oracle实际存储的内容。
1. 向date增加或减去时间
常用的技术有3种:
(1) 向date增加一个number,把date加1是增加1天的一种方法,因此,向date增加1/24就是增加1个小时,依次类推。
(2) 使用interval类型来增加事件单位。Interval类型支持两种粒度:年和月,或日/小时/分钟/秒。也就是说,可以是几年和几个月的一个时间间隔,也可以是几天,几小时,几分钟和几秒的一个时间间隔。
[b](3) 使用内置的add_month函数增加月。[/b]由于增加一个月往往不像增加28-31天那么简单,为了便于增加月,专门实现了这样一个函数。
总的来讲,使用oracle date类型时,建议:
(1) 使用numtodsinterval内置函数来增加小时、分钟和秒。
(2) 加一个简单的数来增加天
(3) 使用add_months内置函数增加月和年。
2. 得到两个日期之差
只是把两个日期相减,会返回表示两个日期相隔天数的一个数;另外,还可以使用内置函数months_between,它会返回表示两个日期相隔月数的一个数(包括月小数);最后,还可以利用interval类型,使用numtodsinterval或numtoyminterval等内置函数。
11.5.3 timestamp类型
Timestamp类型与date非常类似,只不过另外还支持小数秒和时区。
1. Timestamp
基本timestamp数据类型语法很简单:
Timestamp(n)
这里n是可选的,用于指定timestamp中秒分量的小数单位,可以取值为0-9。如果指定0,timestamp在功能上则与data等价,他们实际上会以同样的方式存储相同的值。
2. 向timestamp增加或减去时间
Date执行日期算术运算所用的技术同样适用于timestamp,但是使用上述技术的很多情况下,timestamp会转换为一个date.
3. 得到两个timestamp之差
这正是date和timestamp类型存在显著差异的地方。尽管将date相减的结果是一个number,但timestamp相减的结果却是一个interval.
发表评论
-
<让oracle跑得更快-7> AWR性能报告
2015-03-01 22:45 2128AWR是oracle 10g下提供的一 ... -
<让oracle跑得更快-6> 绑定变量
2015-02-28 21:52 1245变量绑定是OLTP系统中一 ... -
<让oracle跑得更快-5> 执行计划
2015-02-28 21:48 1289如果要分析某条(不是整体性能,后面还会讲到awr报告,会再次说 ... -
<让oracle跑得更快-4> 优化器(optimizer)
2015-02-27 21:27 2052Oracle数据库中优化器(o ... -
<让oracle跑得更快-3> latch和等待
2015-02-27 21:18 1165经常有人把latch造成的 ... -
<让oracle跑得更快-2> 锁和阻塞
2015-02-26 22:24 11632.1 锁和阻塞 首先,注意区别并发(concurrency) ... -
<让oracle跑得更快-1> 引起数据库性能问题的因素
2015-02-26 22:04 1541此《让oracle跑得更快》 ... -
OLTP(联机事务处理)和OLAP(联机分析处理) 【转】
2015-02-12 14:13 1247做数据库优化时,一定要先了解数据库支撑的应用特点,不同类型的应 ... -
<oracle优化>(url收藏)
2015-02-11 22:18 8191. CBO & RBO Rule Based Opt ... -
<oracle-10> 索引
2015-02-01 21:19 2035索引是应用设计和开发的一个重要方面。如果有太多的索引,修改(插 ... -
<oracle-9> 数据库表
2015-01-30 15:44 13189.1 表类型 Oracle主要有 ... -
<oracle-8> redo和undo
2015-01-26 22:23 1650本章介绍oracle数据库中 ... -
<oracle-7> 事务
2015-01-26 11:07 1547事务(transaction)是数 ... -
<oracle-6> 并发多版本控制
2015-01-12 21:17 14636.1 什么是并发控制 并 ... -
<oracle-5> 锁(lock)和闩(latch)
2015-01-07 21:11 2762开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争 ... -
<oracle-4> oracle进程
2015-01-06 23:02 1398Oracle中的各个进程要完成某个特定的任务或一组任务,每个进 ... -
<oracle-3> 内存结构
2015-01-05 22:20 1551这一篇主要讨论oracle的3 ... -
<oracle-2> oracle文件
2014-12-22 20:57 1138与oracle实例相关的文件只有下面几种: 参数文件(para ... -
<Oracle-1> oracle体系结构概述
2014-12-21 22:02 1218本系列主要参考《Oracle ...
相关推荐
1. 数据类型差异:Oracle和SQL Server的数据类型有所不同,例如Oracle的NUMBER可以对应SQL Server的DECIMAL或NUMERIC,DATE类型在SQL Server中需要考虑时间和日期部分。 2. 存储过程和函数:PL/SQL和T-SQL在语法上...
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> ...
- 修改 `<jndi-name>`、`<connection-url>`、`<driver-class>`、`<user-name>` 和 `<password>` 等元素。 **步骤三**: 放置修改后的文件。 - 将修改后的 `sqlserver-ds.xml` 文件放置到 `tobeyou**\server\default...
在开发基于Web的应用程序时,尤其是在使用Java Servlet技术进行开发的过程中,我们经常会遇到从Oracle数据库读取中文数据时出现乱码的情况。这种情况不仅会影响用户体验,还会对数据的正确性造成严重影响。本文将...
2. **文件内容**:该文件用于定义Oracle数据源的相关属性。 - `<local-tx-datasource>`:指定本地事务数据源。 - `<jndi-name>`:设置JNDI名称,本例中为`jdbc/oracle`。 - `<connection-url>`:配置数据库连接...
- OCI Thin Type 4: `jdbc:oracle:thin:@<host>:<port>:<database>` - OCI XA Type 2: `jdbc:oracle:thin:@<host>:<port>:<database>` - `<host>`: Oracle所在计算机的主机名。 - `<port>`: Oracle数据库的...
<servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> ``` - **`context-param`...
<property name="数据库中表的其它字段所对应的持久化对象中的属性名" column="对应数据库中表的其它字段名" type="java.lang.String(数据库中其它字段的数据类型)"/> </class> </hibernate-mapping> 三.配置...
- 数据源格式通常为“数据源名称,数据库类型,字符编码”,例如:“test01,oracle,gb2312”。 **3. `certFile`配置** - 如果选择使用HTTPS协议访问报表,则需要设置服务器安全证书文件的位置。 - 在示例中,证书...
#### 步骤3:配置Oracle数据源 在JBOSS_HOME/server/default/deploy目录下创建一个名为oracle-ds.xml的文件,其中包含Oracle数据库的连接信息。这些信息包括JNDI名称、连接URL、驱动类、用户名、密码以及池的最小和...
在上述配置中,`<Resource>`元素用于定义一个名为`jdbc/oracle`的数据源,类型为`javax.sql.DataSource`。`<ResourceParams>`元素包含了具体的数据库连接参数配置,包括连接池实现类、数据库驱动、连接URL、用户名...
- `<type-mapping>`: 表示数据源元数据中的类型映射方式,在本例中使用`Oracle10g`来指定针对Oracle 10g数据库的特定配置。 #### 三、EJB 3.0配置 接下来,我们来看一下如何利用EJB 3.0技术进行持久化层的配置。 ...
List<Map<String, String>> columns = new ArrayList<>(); ResultSetMetaData meta = rset.getMetaData(); for (int i = 1; i <= meta.getColumnCount(); i++) { String columnName = meta.getColumnName(i); ...
Managed Bean的属性可以通过`<managed-property>`元素定义,可以是字面量字符串,也可以是通过EL表达式从其他Managed Bean访问数据: ```xml <managed-bean> … <managed-property> <property-name>label</...
<datasource-mapping>MSSQLSERVER2000</datasource-mapping> ``` #### 四、日志配置与调试 在开发过程中,日志输出对于调试J2EE应用至关重要。JBoss 3.2.1的日志配置文件通常位于 `C:\jboss-3.2.1_tomcat-4.1.24...
- `<Resource>`: 实际配置了Oracle数据源的具体参数,如URL、用户名、密码等。 ##### 2. 创建项目专属的`context.xml`文件 - **位置**: 在`apache-tomcat-5.5.26\conf\Catalina\localhost`目录下创建一个名为`XXX...
在IT行业中,数据库是存储和管理数据的核心工具,而Java Database Connectivity(JDBC)是Java编程语言中用于访问数据库的标准接口。本知识点将详细介绍如何使用JDBC与MySQL、Oracle、DB2等数据库进行连接,并涉及所...
在IT行业中,服务器和应用服务器的配置是至关重要的,尤其是...提供的压缩包文件"jboss4.0 配置.txt"和"tomcat5.5配置Oracle数据源.txt"应该包含了详细的步骤和可能遇到的问题,读者可以通过这些文件深入学习和实践。
在这篇文章中,我们将深入探讨如何在Struts框架中配置Oracle数据源,以及所需的包和驱动。 首先,我们需要了解配置数据源的基本组件: 1. **JDBC驱动**:为了与Oracle数据库通信,我们需要Oracle的JDBC驱动程序。...