1 数据类型说明

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

MySql 数据类型

可以被转换成的 Java 类型

CHAR, VARCHAR, BLOB, TEXT, ENUM, and SET

java.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob

FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT

java.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal

DATE, TIME, DATETIME, TIMESTAMP

java.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 新引入)

BIT

java.lang.Boolean

BIT(大于 1) (MySQL-5.0 新引入)

BIT

byte[]

TINYINT

TINYINT

如果 tinyInt1isBit 配置设置为 true(默认为 true),是 java.lang.Boolean,存储空间 为 1;否则是为 java.lang.Integer

BOOL, BOOLEAN

TINYINT

参见 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)]

FLOAT

java.lang.Float

DOUBLE[(M,B)]

DOUBLE

java.lang.Double

DECIMAL[(M[,D])]

DECIMAL

java.math.BigDecimal

DATE

DATE

java.sql.Date

DATETIME

DATETIME

java.sql.Timestamp

TIMESTAMP[(M)]

TIMESTAMP

java.sql.Timestamp

TIME

TIME

java.sql.Time

YEAR[(2|4)]

YEAR

如果 yearIsDateType  配置设置为 false,返回的对象类型为 java.sql.Short;如果设置为 true(默认为 true),返回的对象类型是 java.sql.Date,其具体时间是为一月一日零时零分

CHAR(M)

CHAR

java.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])

VARCHAR(M) [BINARY]

VARCHAR

java.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])

BINARY(M)

BINARY

byte[]

VARBINARY(M)

VARBINARY

byte[]

TINYBLOB

TINYBLOB

byte[]

TINYTEXT

VARCHAR

java.lang.String

BLOB

BLOB

byte[]

TEXT

VARCHAR

java.lang.String

MEDIUMBLOB

MEDIUMBLOB

byte[]

MEDIUMTEXT

VARCHAR

java.lang.String

LONGBLOB

LONGBLOB

byte[]

LONGTEXT

VARCHAR

java.lang.String

ENUM('value1','value2',...)

CHAR

java.lang.String

ET('value1','value2',...)

CHAR

java.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年记录的时间有限