61阅读

鼋与鳖的区别-Decimal与Number(Numeric)的区别

发布时间:2018-01-25 所属栏目:鼋与鳖的区别

一 : Decimal与Number(Numeric)的区别

一般用Decimal。 都用于精确存储数值,MSSQL中Decimal与Numeric同义:

何谓精度:最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。

小数位数:小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此,0 <= s <= p。

Oracle中Decimal与Number的区别 :一般用Number。

一、DECIMAL类型详细

Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中(如DB2等)。

因为decimal在Oracle底层就是number类型,所以就当number类型使用就可以了,如果需要对这种字段类型转为char类型可以用to_char函数对其转换。

decimal类型从根本上说应该是数字类型的,因为oracle内部的数据类型,对于数字只有number类型,都当数字类型进行处理即可。decimal(8,2)代表数字总共8位长度,

小数部分是2位。范围是8位,精确到小数点后2位,并四舍五入,即存6位整数,两位小数。也就是最大值可以是999999.99,可存放2位小数。Oracle中,可以使用to_char函数对数字进行转换,使它变成字符类型.

二、NUMBER类型详细

在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在

1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}

的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。

Number的数据声明如下:

eg:

Actual Data Specified As Stored As

----------------------------------------

123.89 NUMBER 123.89

123.89 NUMBER(3) 124

123.89 NUMBER(6,2) 123.89

123.89 NUMBER(6,1) 123.9

123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 > 4) 123.89 NUMBER(6,-2) 100

.01234 NUMBER(4,5) .01234 (有效位为4)

.00012 NUMBER(4,5) .00012

.000127 NUMBER(4,5) .00013

.0000012 NUMBER(2,7) .0000012

.00000123 NUMBER(2,7) .0000012

1.2e-4 NUMBER(2,5) 0.00012

1.2e-5 NUMBER(2,5) 0.00001

123.2564 NUMBER 123.2564

1234.9876 NUMBER(6,2) 1234.99

12345.12345 NUMBER(6,2) Error (有效位为5+2 > 6)

1234.9876 NUMBER(6) 1235 (s没有表示s=0)

12345.345 NUMBER(5,-2) 12300

1234567 NUMBER(5,-2) 1234600

12345678 NUMBER(5,-2) Error (有效位为8 > 7)

123456789 NUMBER(5,-4) 123460000

1234567890 NUMBER(5,-4) Error (有效位为10 > 9)

12345.58 NUMBER(*, 1) 12345.6

0.1 NUMBER(4,5) Error (0.10000, 有效位为5 > 4) 0.01234567 NUMBER(4,5) 0.01235

0.09999 NUMBER(4,5) 0.09999

三、Oracle语句距离

项目中的语句:

[sql] view plaincopyprint? 1. SELECT (CASE WHEN tt1.statistics_date is not null THEN tt1.statistics_date E

LSE tt2.statistics_date END) AS statistics_date, NVL(tt1.actuser,0) AS actuser, NVL(tt2.new_user,0) AS new_user

2. FROM

3. (

4. SELECT t.statistics_date, SUM(t.actuser) AS actuser FROM pdt_stat_act

_1133_i t WHERE t.statistics_date like '2013-04%' and t.statistics_month = '2013-04' GROUP BY t.statistics_date

5. ) tt1

6. FULL JOIN

7. (

8. SELECT t2.statistics_date, SUM(t2.new_user) OVER(ORDER BY t2.stati

stics_date) AS new_user FROM (SELECT statistics_date AS statistics_date, SUM(new_user) AS new_user FROM pdt_stat_newuser_1133_i WHERE statistics_date like '2013-04%' GROUP BY statistics_date) t2

9. ) tt2 ON tt1.statistics_date = tt2.statistics_date

更多 1

?

? 上一篇读书笔记-Don't Make Me Think(Steve Krug) 下一篇oracle中的number数据类型的浅析

二 : Zw*与Nt*的区别

某些Zw*和Nt*函数既在ntdll.dll中导出又在ntoskrnl.exe中导出,他们有什么区别呢?
我们分三部分比较:
step 1: ntdll.dll中的Zw*和Nt*有什么区别?
step 2: ntoskrnl.exe中的Zw*和Nt*有什么区别?
step 3: ntdll.dll中的Zw*与ntoskrnl.exe中的Zw*有什么区别? 
       ntdll.dll中的Nt*与ntoskrnl.exe中的Nt*有什么区别?
在下面的讨论中我们以ZwCreateFile和NtCreateFile为例

讨论前:我先贴点Kd给我们的答案
Part1:
kd> u Ntdll! ZwCreateFile L4
ntdll!ZwCreateFile:
77f87cac b820000000      mov    eax,0x20
77f87cb1 8d542404        lea    edx,[esp+0x4]
77f87cb5 cd2e            int    2e
77f87cb7 c22c00          ret    0x2c
kd> u Ntdll! NtCreateFile L4
ntdll!ZwCreateFile:
77f87cac b820000000      mov    eax,0x20
77f87cb1 8d542404        lea    edx,[esp+0x4]
77f87cb5 cd2e            int    2e
77f87cb7 c22c00          ret    0x2c

Part2:
kd> u Nt!ZwCreateFile L4
nt!ZwCreateFile:
8042fa70 b820000000      mov    eax,0x20
8042fa75 8d542404        lea    edx,[esp+0x4]
8042fa79 cd2e            int    2e
8042fa7b c22c00          ret    0x2c
kd> u Nt!NtCreateFile L14
nt!NtCreateFile:
804a7172 55              push   ebp
804a7173 8bec            mov    ebp,esp
804a7175 33c0            xor    eax,eax
804a7177 50              push   eax
804a7178 50              push   eax
804a7179 50              push   eax
804a717a ff7530          push   dword ptr [ebp+0x30]
804a717d ff752c          push   dword ptr [ebp+0x2c]
804a7180 ff7528          push   dword ptr [ebp+0x28]
804a7183 ff7524          push   dword ptr [ebp+0x24]
804a7186 ff7520          push   dword ptr [ebp+0x20]
804a7189 ff751c          push   dword ptr [ebp+0x1c]
804a718c ff7518          push   dword ptr [ebp+0x18]
804a718f ff7514          push   dword ptr [ebp+0x14]
804a7192 ff7510          push   dword ptr [ebp+0x10]
804a7195 ff750c          push   dword ptr [ebp+0xc]
804a7198 ff7508          push   dword ptr [ebp+0x8]
804a719b e8b284ffff      call   nt!IoCreateFile (8049f652)
804a71a0 5d              pop    ebp
804a71a1 c22c00          ret    0x2c



1) Part1 输出的是Ntdll.dll中ZwCreateFile和NtCreateFile的汇编代码,我们发现实现是一样的;
eax是中断号,edx是函数的参数起始地址([Esp]是返回地址);从而我可以大胆的说:Ntdll.dll中ZwCreateFile和NtCreateFile功能是一样的作用:都是调用int 2E中断;

IDA给我们的答案:
.text:77F87CAC ; Exported entry 92. NtCreateFile
.text:77F87CAC ; Exported entry 740. ZwCreateFile
.text:77F87CAC
.text:77F87CAC
.text:77F87CAC                public ZwCreateFile

扩展:s 1jgnt1zw这种资源 / 南通电子监察 ntsunzw / 压缩机zw型和vw型区别


.text:77F87CAC ZwCreateFile   proc near              ;
.text:77F87CAC
.text:77F87CAC arg_0          = dword ptr 4
.text:77F87CAC
.text:77F87CAC                mov    eax, 20h       ; NtCreateFile
.text:77F87CB1                lea    edx, [esp+arg_0]
.text:77F87CB5                int    2Eh            ; DOS 2+ internal - EXECUTE COMMAND
.text:77F87CB5                                        ; DS:SI -> counted CR-terminated command string
.text:77F87CB7                retn   2Ch
.text:77F87CB7 ZwCreateFile   endp

原来在ntdll中NtCreateFile只是ZwCreateFile的别名。(www.61k.com]



2) Part2 输出的是Ntoskrnl.exe中ZwCreateFile和NtCreateFile的汇编代码,也许令你很失望,汇编代码不一 样;ZwCreateFile中eax是中断号,edx是函数的参数起始地址,然后调用int 2E中断; NtCreateFile只是把参数入栈去调用IoCreateFile;
他们的区别是:NtCreateFile是实现代码,而 ZwCreateFile仍通过中断来实现功能,2E软中断的20h子中断号的处理程序是NtCreateFile;这样一说他们是没区别了? 错!NtCreateFile是在ring0下了,而ZwCreateFile是通过int 2E进入ring0的,而不论ZwCreateFile处于什么模式下。



3) 从而我们得出:
  ntdll.dll中ZwCreateFile与ntoskrnl.exe中ZwCreateFile的区别是:前者是user Mode application called,后者是Kernel Mode driver Called;
   ntdll.dll中NtCreateFile与ntoskrnl.exe中NtCreateFile区别是:前者在ring3下工作,后者在ring0下工作;前者通过中断实现,后者是前者的中断处理程序。

扩展:s 1jgnt1zw这种资源 / 南通电子监察 ntsunzw / 压缩机zw型和vw型区别

三 : nil、Nil、NULL与NSNull的区别

1.nil[www.61k.com)

指向一个对象的指针为空 在objc.h中的定义如下所示:
#ifndef nil# if __has_feature(cxx_nullptr)# define nil nullptr# else# define nil __DARWIN_NULL# endif#endif
在Objective-C中用于id类型的对象
NSString *name = nil;NSURL *url = nil;id object = nil;

2.Nil

指向一个类的指针为空 定义如下:
#ifndef Nil# if __has_feature(cxx_nullptr)# define Nil nullptr# else# define Nil __DARWIN_NULL# endif#endif
在Objective-C中用于Class类型的对象
Class aClass = Nil;Clsss bClass = [NSURL class];

3.NULL

指向C类型的指针为空 在stddef.h中定义如下:
#if defined(__need_NULL)#undef NULL#ifdef __cplusplus# if !defined(__MINGW32__) && !defined(_MSC_VER)# define NULL __null# else# define NULL 0# endif#else# define NULL ((void*)0)#endif
多用于如下例子:
int *pInt = NULL;char *chChar= NULL;struct stStruct = NULL;

4.NSNull

在Objective-C中是一个类,只是名字中有个Null,NSNull有 + (NSNull *)null; 单例方法,多用于集合(NSArray,NSDictionary)中值为空的对象
NSArray *array = [NSArray arrayWithObjects: [[NSObject alloc] init], [NSNull null], @"aaa", nil, [[NSObject alloc] init], [[NSObject alloc] init], nil];NSLog(@"%ld", array.count); // 输出 3,NSArray以nil结尾
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: @"Object0", @"Key0", @"Object1", @"Key1", nil, @"Key-nil" @"Object2", @"Key2", nil];NSLog(@"%@", dictionary); // 输出2个key-value,NSDictionary也是以nil结尾
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];[mutableDictionary setObject:nil forKey:@"Key-nil"]; // 会引起Crash[mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不会引起Crash
所以在使用时,如下方法是比较安全的
[mutableDictionary setObject:(nil == value ? [NSNull null] : value) forKey:@"Key"];

本文标题:鼋与鳖的区别-Decimal与Number(Numeric)的区别
本文地址: http://www.61k.com/1125291.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1