今天遇到的问题:用jdbc存数据,打算存一个long类型。
找了一下发现mysql的字段没有long类型呀,于是就在java端将long强转成了int类型,结果发现long格式下好好的毫秒,转成int之后变成了莫名其妙的数据(其实就是溢出了)。
写个demo研究一下mysql中对应的数据类型。
一、java mysql数据类型对照
类型名称 | 显示长度 | 数据库类型 | JAVA类型 | JDBC类型索引(int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |
对于bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在java中对应byte[]数组。
对于boolen类型,在mysql数据库中,个人认为用int类型代替较好(其实是一样的)。
二、解决方法
我把字段换了tinyblob类型,瞬间long型的数据也可以存了…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package test; import java.sql.SQLException; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; public class setpunishtime { public static void setpunishtime() { Connection conn = dbconnection.getConnection(); PreparedStatement preparedStatement = null; StringBuilder sb = new StringBuilder(); sb.append(" update user set punishtime = ? where username = ? "); try { preparedStatement = (PreparedStatement) conn.prepareStatement(sb.toString()); preparedStatement.setLong(1, System.currentTimeMillis()); preparedStatement.setString(2, "admin"); preparedStatement.execute(); System.out.println("执行成功!"); } catch (SQLException e) { System.out.println("执行失败!"); e.printStackTrace(); } finally { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { setpunishtime(); System.out.println(System.currentTimeMillis()); } } |
结果为:
1 2 |
执行成功! 1447691203084 |
三、总结
知道什么类型的数据对应什么数据库字段,在设计的时候特别重要,需要重点学习。