mysql java 类型转换_Java中数据类型和MySQL数据类型比较分析(转)

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代码 a4c26d1e5885305701be709a3d33442f.png

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,其他数据库可能不同。有不妥的地方请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值