Mysql常⽤字段类型以及对应JAVA中的数据类型
MySQL的列类型主要有三种:数字、字串和⽇期。
个⼈最常⽤的MySQL数据类型是VARCHAR, DECIMAL, DATETIME, INT, TEXT
下⾯来详细的说明,不⼀定准确不⼀定完整,请多包含或者提出您的建议.
1、数字列类型
数字列类型⽤于储存各种数字数据,如价格、年龄或者数量。数字列类型主要分为两种:整数型和浮点型。所有的数字列类型都允许有两个选项:UNSIGNED和ZEROFILL。选择UNSIGNED的列不允许有负数,选择了ZEROFILL的列会为数值添加零。下⾯是MySQL中可⽤的数字列类型TINYINT——⼀个微⼩的整数,⽀持 -128到127(SIGNED),0到255(UNSIGNED),需要1个字节存储
BIT——同TINYINT(1)
BOOL——同TINYINT(1)
SMALLINT——⼀个⼩整数,⽀持 -32768到32767(SIGNED),0到65535(UNSIGNED),需要2个字节存储
MEDIUMINT——⼀个中等整数,⽀持 -8388608到8388607(SIGNED),0到16777215(UNSIGNED),需要3个字节存储
INT——⼀个整数,⽀持 -2147493648到2147493647(SIGNED),0到4294967295(UNSIGNED),需要4个字节存储
保存那些不包含⼩数点的整数,可以容纳(正负)⼗位数。
当我们在选择使⽤int的类型的时候,不论是int(3)还是int(11),它在数据库⾥⾯存储的都是4个字节的长度,在使⽤int(3)的时候如果你输⼊的是10,会默认给你存储位010,也就是说这个3代表的是默认的⼀个长度,当你不⾜3位时,会帮你不全,当你超过3位时,就没有任何的影响。
INTEGER——同INT
BIGINT——⼀个⼤整数,⽀持 -9223372036854775808到9223372036854775807(SIGNED),0到18446744073709551615(UNSIGNED),需要8个字节存储FLOAT(precision)——⼀个浮点数。precision<=24⽤于单精度浮点数;precision在25和53之间,⽤于⼜精度浮点数。FLOAT(X)与相诮的FLOAT和DOUBLE类型有差相同的范围,但是没有定义显⽰尺⼨和⼩数位数。在MySQL3.23之前,这不是⼀个真的浮点值,且总是有两位⼩数。MySQL中的所有计算都⽤双精度,所以这会带来⼀些意想不到的问题。
FLOAT——⼀个⼩的菜单精度浮点数。⽀持 -3.402823466E+38到-1.175494351E-38,0和1.175494351E-38 to 3.402823466E+38,需要4个字节存储。如果是UNSIGNED,正数的范围保持不变,但负数是不允许的。
DOUBLE——⼀个双精度浮点数。⽀持 -1.7976931348623157E+308到-2.2250738585072014E-308,0和2.2250738585072014E-308到
1.7976931348623157E+308。如果是FLOAT,UNSIGNED不会改变正数范围,但负数是不允许的。
DOUBLE PRECISION——同DOUBLE
REAL——同DOUBLE
DECIMAL——⼀个定点数,将⼀个数像字符串那样存储,每个字符占⼀个字节
DECIMAL最适合保存那些将被⽤于计算的数据。在MySQL中,我们可以指定保存⼀些正当的数字。还可以指定是否允许存在负值。
指定DECIMAL类型的长度会稍微棘⼿些,Decimal(m,d),m和d对float和double 都是可选的,但对于decimal是必须的。在选项m 和d时,如果省略了它们,则使⽤缺省值。例如,如果你需要在⼩数点前
⾯保存五位数,且⼩数点后只保留三位,那么在数据库中其适当的长度将是:Decimal(5+3,3) 即 Decimal(8,3),可以使⽤的数据包括:12345.678,56872.690,11.6和12.568等等。⽽下⾯这些数字则会引发出错信息,例如:128781.1,8972865.231。
NUMERIC——同DECIMAL
注意:
在选择了某种数值类型时,应该考虑所要表⽰的值的范围,只需选择能覆盖要取值的范围的最⼩类型即可。选择较⼤类型会对空间造成浪费,使表不必要地增⼤,处理起来没有选择较⼩类型那样有效。对于整型值,如果数据取值范围较⼩,如⼈员年龄或兄弟妹数,则tinyint最合适。mediumint能够表⽰数百万的值并且可⽤于更多类型的值,但存储代价较⼤。bigint在全部整型中取值范围最⼤,⽽且需要的存储空间是表⽰范围次⼤的整型int类型的两倍,因此只在确实需要时才⽤。对于浮点值,double占⽤float的两倍空间。除⾮特别需要⾼精度或范围极⼤的值,⼀般应使⽤只⽤⼀半存储代价的float型来表⽰数据。
在定义整型列时,可以指定可选的显⽰尺⼨m。如果这样,m应该是⼀个1 到255的整数。它表⽰⽤来显⽰列中值的字符数。例如,mediumint(4)指定了⼀个具有4个字符显⽰宽度的mediumint列。如果定义了⼀个没有明确宽度的整数列,将会⾃动分配给它⼀个缺省的宽度。缺省值为每种类型的“最长”值的
长度。如果某个特定值的可打印表⽰需要不⽌m个字符,则显⽰完全的值;不会将值截断以适合m个字符。
对每种浮点类型,可指定⼀个最⼤的显⽰尺⼨m 和⼩数位数d。m 的值应该取1 到255。d的值可为0 到3 0,但是不应⼤于m - 2(如果熟悉odbc 术语,就会知道m 和d 对应于odbc 概念的“精度”和“⼩数点位数”)。m和d对float和double 都是可选的,但对于decimal是必须的。在选项m 和d时,如果省略了它们,则使⽤缺省值
浮点类型和定点类型的选择
1)浮点类型(float和double)
MySQL数据类型含义
float(m,d)单精度浮点型 8位精度(4字节) m总个数,d⼩数位
double(m,d)双精度浮点型 16位精度(8字节) m总个数,d⼩数位
设⼀个字段定义为float(5,3),如果插⼊⼀个数123.45678,实际数据库⾥存的是123.457,但总个数还以实际为准,即6位。
2)定点类型
浮点型在数据库中存放的是近似值,⽽定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是⼩数位。
MySQL5.0和更⾼版本将数字打包保存到⼀个⼆进制字符串中(每4个直接存9个数字)。例如,decimal(18,9)⼩数点两边将各存储9个数字,⼀共使⽤9个字节:⼩数点前的数字⽤4个字节,⼩数点后的数字⽤4个字节,⼩数点本⾝占1个字节。
浮点类型在存储同样范围的值时,通常⽐decimal使⽤更少的空间。float使⽤4个字节存储。double占⽤8个字节。
因为需要额外的空间和计算开销,所以应该尽量只在对⼩数进⾏精确计算时才使⽤decimal——例如存储财务数据。但在数据量⽐较⼤的时候,可以考虑使⽤bigint代替decimal。
2、字符串列类型
字符串列类型⽤于存储任何类型的字符数据,如名字、地址或者报纸⽂章。下⾯是MySQL中可⽤的字符串列类型
CHAR——字符。固定长度的字串,在右边补齐空格,达到指定的长度。⽀持从0到155个字符。搜索值时,后缀的空格将被删除。
VARCHAR——可变长的字符。⼀个可变长度的字串,其中的后缀空格在存储值时被删除。⽀持从0到255字符
通常⽤来表⽰最多为65535个字符的变量长度字符串。如果你要储存和处理字母数字类的数据,这种数据类型是最合适的。适⽤于这类数据的典型例⼦包括⼈名,,电话号码和不超过65535个字符长度的任意字母数字组合。那些要⽤来计算的数字不要⽤VARCHAR类型保存,因为可能会导致⼀些与计算相关的问题。换句话说,可能影响到计算的准确性和完整性。
MySQL 数据库的varchar类型在4.1以下的版本中的最⼤长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度⽀持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节,也就是说,在4.1或以下版本中需要使⽤固定的TEXT或BLOB格式存放的数据可以使⽤可变长的varchar来存放,这样就能有效的减少数据库⽂件的⼤⼩。
TINYBLOB——微⼩的⼆进制对象。⽀持255个字符。需要长度+1字节的存储。与TINYTEXT⼀样,只不过搜索时是区分⼤⼩写的。(0.25KB) TINYTEXT——⽀持255个字符。要求长度+1字节的存储。与T
INYBLOB⼀样,只不过搜索时会忽略⼤⼩写。(0.25KB)
BLOB——⼆进制对象。⽀持65535个字符。需要长度+2字节的存储。 (64KB)
TEXT——⽀持65535个字符。要求长度+2字节的存储。 (64KB)
可以接受⽂本输⼊,VARCHAR只能接受255个字符,但是TEXT可以⽤来存储超量的数据。
MEDIUMBLOB——中等⼤⼩的⼆进制对象。⽀持16777215个字符。需要长度+3字节的存储。 (16M)
MEDIUMTEXT——⽀持16777215个字符。需要长度+3字节的存储。 (16M)
LONGBLOB——⼤的的⼆进制对象。⽀持4294967295个字符。需要长度+4字节的存储。 (4G)
LONGTEXT——⽀持4294967295个字符。需要长度+4字节的存储。(4G)
ENUM——枚举。只能有⼀个指定的值,即NULL或"",最⼤有65535个值
SET——⼀个集合。可以有0到64个值,均来⾃于指定清单.
decimal是整数数据类型CHAR(M), VARCHAR(M)不同之处
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进⾏⼤⼩写转换。CHAR存储定长数据很⽅便,CHAR字段上的索引效率级⾼,⽐如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不⾜的⾃动⽤空格填充。
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最⼤有效长度由最⼤⾏⼤⼩和使⽤的字符集确定。整体最⼤长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加⼀个字节来记录长度(如果列声明的长度超过255,则使⽤两个字节)。VARCHAR值保存时不进⾏填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR⾼。如果⼀个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这⼀个字节⽤于保存实际使⽤了多⼤的长度。从空间上考虑,⽤varchar合适;从效率上考虑,⽤char合适,关键是根据实际情况到权衡点。
CHAR和VARCHAR最⼤的不同就是⼀个是固定长度,⼀个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上⼀个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最⼤长度,则对值进⾏裁剪以使其适合。如果被裁掉的字符不是空格,则会产⽣⼀条警告。如果裁剪⾮空格字符,则会造成错误(⽽不是警告)并通过使⽤严格SQL模式禁
⽤值的插⼊。
VARCHAR和TEXT、BlOB类型的区别
VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前⾯的表格中⽤L表⽰),⽽不是取决于类型的最⼤可能尺⼨。例如,⼀个VARCHAR(10)列能保存最⼤长度为10个字符的⼀个字符串,实际的存储需要是字符串的长度,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4⽽存储要求是5个字节。
BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最⼤可能长度。VARCHAR需要定义⼤⼩,有65535字节的最⼤限制;TEXT则不需要。如果你把⼀个超过列类型最⼤长度的值赋给⼀个BLOB或TEXT列,值被截断以适合它。
⼀个BLOB是⼀个能保存可变数量的数据的⼆进制的⼤对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最⼤长度⽅⾯有所不同。
BLOB 可以储存图⽚,TEXT不⾏,TEXT只能储存纯⽂本⽂件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最⼤长度和存储需求。在BLOB和TEXT类型之间的唯⼀差别是对BLOB值的排序和⽐较以⼤⼩写敏感⽅式执⾏,⽽对TEXT值是⼤⼩写不敏感的。换句话说,⼀个TEXT是⼀个⼤⼩写不敏感的BLOB。
总结char,varchar,text区别
长度的区别,char范围是0~255,varchar最长是64k,但是注意这⾥的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占⽤⼀位,对不同的字符集,有效长度还不⼀样,⽐如utf8的,最多21845,还要除去别的column,但是varchar在⼀般情况下存储都够⽤了。如果遇到了⼤⽂本,考虑使⽤text,最⼤能到4G。
效率来说基本是char>varchar>text,但是如果使⽤的是Innodb引擎的话,推荐使⽤varchar代替char
char和varchar可以有默认值,text不能指定默认值
数据库选择合适的数据类型存储还是很有必要的,对性能有⼀定影响。这⾥在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,×××的尤其适合加索引。
3、⽇期和时间列类型
⽇期和时间列类型⽤于处理时间数据,可以存储当⽇的时间或出⽣⽇期这样的数据。格式的规定:Y表⽰年、M(前M)表⽰⽉、D表⽰⽇、H表⽰⼩时、M(后M)表⽰分钟、S表⽰秒。下⾯是MySQL中可⽤的⽇期和时间列类型
DATETIME——格式:'YYYY-MM-DD HH:MM:SS',范围:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
DATE——格式:'YYYY-MM-DD',范围:'1000-01-01'到'9999-12-31'
TIMESTAMP——格式:'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS'、'YYYYMMDD'、'YYMMDD',范围:'1970-01-01 00:00:00'到'2037-01-01 00:00:00' TIME——格式:'HH:MM:SS'
YEAR——格式:'YYYY,范围:'1901'到'2155'
MySQL数据类型含义
date⽇期 '2008-12-2'
time时间 '12:25:36'
datetime⽇期时间 '2008-12-2 22:06:44'
timestamp⾃动存储记录修改时间
若定义⼀个字段为timestamp,这个字段⾥的时间数据会随其他字段修改的时候⾃动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
4、对应JAVA中的数据类型
A、常规Hibernate 映射
integer 或者 int int 或者 java.lang.Integer INTEGER 4 字节
long long Long BIGINT8 字节
short short Short SMALLINT 2 字节
byte byte Byte TINYINT 1 字节
float float Float FLOAT 4 字节
double double Double DOUBLE8 字节
big_decimal java.math.BigDecimal NUMERIC NUMERIC(8,2)8 位
character char Character String CHAR(1)定长字符
string String VARCHAR变长字符串
boolean boolean Boolean BIT布尔类型
yes_no boolean Boolean CHAR(1) (Y-N)布尔类型
true_false boolean Boolean CHAR(1) (T-F)布尔类型
B 、 Java 时间和⽇期类型的 Hibernate 映射
映射类型Java 类型标准 SQL 类型描述
date util.Date 或者 sql.Date DATE YYYY-MM-DD
time Date Time TIME HH:MM:SS
timestamp Date Timestamp TIMESTAMP YYYYMMDDHHMMSS
calendar calendar TIMESTAMP YYYYMMDDHHMMSS
calendar_date calendar DATE YYYY-MM-DD
C、 Java ⼤对象类型的 Hibernate 映射类型
映射类型Java 类型标准 SQL 类型MySQL 类型Oracle 类型binary byte[]VARBINARY( 或 BLOB)BLOB BLOB
text String CLOB TEXT CLOB serializable Serializable 接⼝任意实现类VARBINARY( 或 BLOB)BLOB BLOB clob java.sql.Clob CLOB TEXT CLOB blob java.sql.Blob BLOB BLOB BLOB
在程序中通过 Hibernate 来保存 java.sql.Clob 或者 java.sql.Blob 实例时,必须包含两个步骤:
1.在⼀个数据库事务中先保存⼀个空的 Blob 或 Clob 实例。
2.接着锁定这条记录,更新上⾯保存的 Blob 或 Clob 实例,把⼆进制数据或⽂本数据写到 Blob 或 Clob 实例中
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论