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