2、Java中的数据类型和SQL中的数据类型有很多不一样,需要仔细区分,不然易在开发中造成莫名的错误。
http://blog.csdn.net/yangyinbo/article/details/6212394
Java数据类型
标准SQL数据类型(PS:对于不同的DB可能有所差异)
byte,java.lang.Byte
-128~127,占用1个字节(-2的7次方到2的7次方-1)
UNSIGNED为:0~255(共256个)
byte
TINYINT
short,java.lang.Short
-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
UNSIGNED为: 0~65536(共65537个)
short
SMALLINT
int、java.lang.Integer
(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
UNSIGNED为:0~42
9496 7295 (42亿多)
integer
INGEGER
long、java.lang.Long
(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
UNSIGNED为:0~1844 6744 0737 0955
1615(天文数字)
long
BIGINT
float、java.lang.Float
float 3.402823e+38 ~
1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节
float
FLOAT
double、java.lang.Double
double 1.797693e+308~ 4.9000000e-324
占用8个字节
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。
浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
double
DOUBLE
java.math.BigDecimal
big_decimal
NUMERIC
char、java.lang.Character
character
CHAR(1)
boolean、java.lang.Boolean
boolean
BIT
java.lang.String
string
VARCHAR
boolean、java.lang.Boolean
yes_no
CHAR(1)(‘Y’或‘N’)
boolean、java.lang.Boolean
true_false
CHAR(1)(‘Y’或‘N’)
java.util.Date、java.sql.Date
date
DATE
java.util.Date、java.sql.Time
time
TIME
java.util.Date、java.sql.Timestamp
timestamp
TIMESTAMP
java.util.Calendar
calendar
TIMESTAMP
java.util.Calendar
calendar_date
DATE
byte[]
binary
VARBINARY、BLOB
java.lang.String
text
CLOB
java.io.Serializable
serializable
VARBINARY、BLOB
java.sql.Clob
clob
CLOB
java.sql.Blob
blob
BLOB
java.lang.Class
class
VARCHAR
java.util.Locale
locale
VARCHAR
java.util.TimeZone
timezone
VARCHAR
java.util.Currency
currency
VARCHAR
3、如何解读FLOAT和DOUBLE类型
public static void main(String[] args)
{
System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE));
//内存溢出
System.out.println(Integer.MAX_VALUE);
//2的31次方-1,10个数位,正的20亿左右,用在钱上面不一定够
System.out.println(Integer.MIN_VALUE);
//负的2的31次方
System.out.println(Long.MAX_VALUE);
//2的64次方-1,19个数位,很大了,可放心用在钱上面
System.out.println(Long.MIN_VALUE);
//负的2的64次方
System.out.println(Float.MAX_VALUE);
//2的128次方-1,38个数位,比long多了一倍,这个主要用来做简单数学精确运算使用
System.out.println(Float.MIN_VALUE);
//2的-149次方
System.out.println(Double.MAX_VALUE);
//2的1024次方-1,308个数位,是float数位的10倍,主要用来做复杂运算和天文运算
System.out.println(Double.MIN_VALUE);
//2的-1074次方
FLOAT和DOUBLE类型他们采用的是IEEE 754标准,这个标准可以这样理解:
(1)两者还是32位的,和int一样,最小值只是他们的精度,是正数,这是需要注意的。如果要取到他们负最大,在他们的最大值前加个符号就好了,如-Float.MAX_VALUE,就是float能表示的负的最大了。
(2)float从左到右,第一位是符号位,2-9位共8位表示整数位,2的8-1次方等于128,后面23位是表示小数的,所以最大值是2^128-1;
(3)double从左到右,第一位是符号位,2-12是共11位表示整数位,2的11-1次方等于1024。剩余20位表示小数,所以最大值是2^1024-1.
(4)如上面代码,当正的最大减去负的正最大,就产生了内存泄露。溢出的结果是不对的。
总结:int
和long,float和double的存储要分别对待.要取到实实在在的最大最小值,只需要取到最大值就行了。
4、BigDecimal简介
原文链接:http://blog.csdn.net/jackiehff/article/details/8582449
4.1 引言
借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
4.2BigDecimal简介
BigDecimal
由任意精度的整数非标度值 和32
位的整数标度 (scale)
组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale
次幂。因此,BigDecimal表示的数值是(unscaledValue ×
10-scale)。
5、Java中Byte[]数据类型介绍
原文链接:http://perfect5085.iteye.com/blog/1612694
Java代码
publicstaticString bytes2HexString(byte[] b) {
String ret = "";
for(inti =0; i
String hex = Integer.toHexString(b[ i ] & 0xFF);
if(hex.length() ==1) {
hex = '0'+ hex;
}
ret += hex.toUpperCase();
}
returnret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] &
0xFF将一个byte和 0xFF进行了与运算,
然后使用Integer.toHexString取得了十六进制字符串,可以看出b[ i ] &
0xFF运算后得出的仍然是个int,
那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i
]);,将byte强转为int不行吗?
答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的数字类型:正数在计算机中是以原码形式存在的,负数在计算机中是以其补码形式存在的
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1 1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127, 负数最大为1111
1111,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
1、反码:
一个数如果是正,则它的反码与原码相同;
一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
对于十进制数,从9得到5可用减法:
9-4=5 因为4+6=10,我们可以将6作为4的补数
改写为加法:
9+6=15(去掉高位1,也就是减10)得到5.
对于十六进制数,从c到5可用减法:
c-7=5 因为7+9=16 将9作为7的补数
改写为加法:
c+9=15(去掉高位1,也就是减16)得到5.
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。
⑴一个数为正,则它的原码、反码、补码相同
⑵一个数为负,补码为:负数的绝对值的反码加1
- 1的原码为 10000001
- 1的反码为 11111110
+ 1
- 1的补码为 11111111
10 原码:0000 1010 它在计算机中的存储就是 0000
1010,
-10 绝对值10 原码: 0000 1010 反码: 1111 0101 再加1后:1111 0110,此为-10补码,
好的,计算机中的1111 0110就是代表-10了。
-128 绝对值128的二进制表示:1000 0000 按位取反 0111 1111
加1后:1000 0000,
也就是说 -128在计算机中的表示就是 1000 0000 了,
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,
由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!
即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。
//Java
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,
如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,
举例来说,一个byte的-1(即0xff),会被转换成int的-1(即
0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,
这样,结果中的高的24个比特就总会被清0, 于是结果总是我们想要的。
原文链接:http://blog.csdn.net/luoweifu/article/details/7770588
很多初学者(包括我,已经学了一年多Java了)肯会对char和byte这两种数据类型有所疑惑,相互混淆,今天特地查了好多资料,对byte和char两种数据类型进行了总结和比较,先将结果与大家分享:
byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127
。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码);大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。
下面用实例来比较一下二者的区别:
1、Char是无符号型的,可以表示一个整数,不能表示负数;而byte是有符号型的,可以表示-128—127 的数;如:
charc= (char) -3; // char不能识别负数,必须强制转换否则报错,即使强制转换之后,也无法识别
System.out.println(c);
byte d1=1;
byte d2= -1;
byte d3=127; // 如果是byted3=128;会报错
byte d4= -128; // 如果是byted4= -129;会报错
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
System.out.println(d4);
结果为:
?
1
-1
127
-128
2、char可以表中文字符,byte不可以,如:
chare1='中',e2='国';
byte f= (byte) '中'; //必须强制转换否则报错
System.out.println(e1);
System.out.println(e2);
System.out.println(f);
结果为:
中
国
45
3、char、byte、int对于英文字符,可以相互转化,如:
byteg='b'; //b对应ASCII是98
char h= (char) g;
char i=85; //U对应ASCII是85
int j='h'; //h对应ASCII是104
System.out.println(g);
System.out.println(h);
System.out.println(i);
System.out.println(j);
结果为:
98
b
U
104
原文链接:http://blog.csdn.net/wxq1987525/article/details/6564380
具体对这三种类型的说明不做阐述可以查看MySQL帮助文档。
char的总结: char最大长度是255字符,注意是字符数和字符集没关系。可以有默认值,尾部有空格会被截断。varchar的总结: varchar的最大长度65535是指能存储的字节数,其实最多只能存储65532个字节,还有3个字节用于存储长度。注意是字节数这个和字符集有关系。一个汉字字符用utf8占用3字节,用gbk占用2字节。可以有默认值,尾部有空格不会截断。
text的总结: text和varchar基本相同。text会忽略指定的大小这和varchar有所不同,text不能有默认值。尾部有空格不会被截断。text使用额外的2个字节来存储数据的大小,varchar根据存储数据的大小选择用几个字节来存储。text的65535字节全部用来存储数据,varchar则会占用1-3个字节去存储数据大小。
上面所说的一切只针对mysql,其他数据库可能不同。有不妥的地方请指出。