Java 数据类型和 MySql 数据类型对应一览表

本文整理了MySQL与Java数据类型转换的相关知识,MySQL Connector/J对二者类型转换灵活,ResultSet.getObject()遵循JDBC规范转换。使用数据库连接工具时要注意BIGINT有无符号的类型匹配问题。还比较了mysql数据库时间类型datetime、bigint、timestamp的查询效率,并给出使用建议。

这篇文章资料来自于网络,对部分知识整理,这里只是记录一下,仅供参考。

1 数据类型说明

        MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的。 
        一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.String,任何 MySql 数字类型都可以被转换为任何一种 Java 数字类型(当然这样也可能出一些四舍五入,溢出,精度丢失之类的问题)。 
转换表

MySql 数据类型可以被转换成的 Java 类型
CHAR, VARCHAR, BLOB, TEXT, ENUM, and SETjava.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINTjava.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMPjava.lang.String, java.sql.Date, java.sql.Timestamp

2 类型对应

ResultSet.getObject() 方法遵循 JDBC 规范对 MySql 和 Java 的类型进行转换。 
ResultSet.getObject() 对 MySql 类型和 Java 类型转换表

MySql 类型名GetColumnClassName 返回值返回的 Java 类
BIT(1)(MySQL-5.0 新引入)BITjava.lang.Boolean
BIT(大于 1) (MySQL-5.0 新引入)BITbyte[]
TINYINTTINYINT如果 tinyInt1isBit 配置设置为 true(默认为 true),是 java.lang.Boolean,存储空间 为 1;否则是为 java.lang.Integer
BOOL, BOOLEANTINYINT参见 TINYINT。这些是 TINYINT(1) 另一种写法而已
SMALLINT[(M)] [UNSIGNED]SMALLINT [UNSIGNED]java.lang.Integer(不管是否无符)
MEDIUMINT[(M)] [UNSIGNED]MEDIUMINT [UNSIGNED]java.lang.Integer;无符的话是 java.lang.Long(C/J 3.1 或更早),或者 java.lang.Integer(C/J 5.0 或更晚)
INT,INTEGER[(M)] [UNSIGNED]INTEGER [UNSIGNED]java.lang.Integer;无符的话是 java.lang.Long
BIGINT[(M)] [UNSIGNED]BIGINT [UNSIGNED]java.lang.Long;无符的话是 java.math.BigInteger
FLOAT[(M,D)]FLOATjava.lang.Float
DOUBLE[(M,B)]DOUBLEjava.lang.Double
DECIMAL[(M[,D])]DECIMALjava.math.BigDecimal
DATEDATEjava.sql.Date
DATETIMEDATETIMEjava.sql.Timestamp
TIMESTAMP[(M)]TIMESTAMPjava.sql.Timestamp
TIMETIMEjava.sql.Time
YEAR[(2|4)]YEAR如果 yearIsDateType  配置设置为 false,返回的对象类型为 java.sql.Short;如果设置为 true(默认为 true),返回的对象类型是 java.sql.Date,其具体时间是为一月一日零时零分
CHAR(M)CHARjava.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])
VARCHAR(M) [BINARY]VARCHARjava.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])
BINARY(M)BINARYbyte[]
VARBINARY(M)VARBINARYbyte[]
TINYBLOBTINYBLOBbyte[]
TINYTEXTVARCHARjava.lang.String
BLOBBLOBbyte[]
TEXTVARCHARjava.lang.String
MEDIUMBLOBMEDIUMBLOBbyte[]
MEDIUMTEXTVARCHARjava.lang.String
LONGBLOBLONGBLOBbyte[]
LONGTEXTVARCHARjava.lang.String
ENUM('value1','value2',...)CHARjava.lang.String
ET('value1','value2',...)CHARjava.lang.String

3 注意事项

  MYSQL BIGINT: argument type mismatch

      如JDBC的BIGINT-->Java的java.lang.Long;
      JDBC的BIGINT UNSIGNED-->Java的 java.math.BigInteger。
      而在使用一些数据库连接工具的时候,一定要注意这一点,如果不注意勾到 无符号,那么   bigint则变为了 BigInteger, 导致出现一些 参数类型匹配错误的问题 如   argument type mismatch 的问题.

      如果不是无符号类型,BIGINT(20)的取值范围为-9223372036854775808~9223372036854775807。与Java.lang.Long的取值范围完全一致,mybatis会将其映射为Long;

      而BIGINT(20) UNSIGNED的取值范围是0 ~ 18446744073709551615,其中一半的数据超出了Long的取值范围,Mybatis将其映射为BigInteger。

5 其他

  mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

  • 结论 在InnoDB存储引擎下,通过时间范围查找,性能bigint > datetime > timestamp
  • 结论 在InnoDB存储引擎下,通过时间分组,性能timestamp > datetime,但是相差不大
  • 结论 在InnoDB存储引擎下,通过时间排序,性能bigint > timestamp > datetime

   小结

      如果需要对时间字段进行操作(如通过时间范围查找或者排序等),推荐使用bigint,如果时间字段不需要进行任何操作,推荐使用timestamp,使用4个字节保存比较节省空间,但是只能记录到2038年记录的时间有限

  参考:https://juejin.im/post/5bd6a089e51d45437252599e


原文链接: http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值