文章目录
- 数据类型对照表
- MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比
- 关于 MySQL 整型显示位数的问题
- 关于 MySQL 的 timestamp
- 关于 JDBC 类型
数据类型对照表
Mysql | Oracle | Java |
---|---|---|
BIGINT | NUMBER(19,0) | java.lang.Long |
BIT | RAW | byte[] |
BLOB | BLOB RAW | byte[] |
CHAR | CHAR | java.lang.String |
DATE | DATE | java.sql.Date |
DATETIME | DATE | java.sql.Timestamp |
DECIMAL | FLOAT (24) | java.math.BigDecimal |
DOUBLE | FLOAT (24) | java.lang.Double |
DOUBLE PRECISION | FLOAT (24) | java.lang.Double |
ENUM | VARCHAR2 | java.lang.String |
FLOAT | FLOAT | java.lang.Float |
INT | NUMBER(10,0) | java.lang.Integer |
INTEGER | NUMBER(10,0) | java.lang.Integer |
LONGBLOB | BLOB RAW | byte[] |
LONGTEXT | CLOB RAW | java.lang.String |
MEDIUMBLOB | BLOB RAW | byte[] |
MEDIUMINT | NUMBER(7,0) | java.lang.Integer |
MEDIUMTEXT | CLOB RAW | java.lang.String |
NUMERIC | NUMBER | |
REAL | FLOAT (24) | |
SET | VARCHAR2 | java.lang.String |
SMALLINT | NUMBER(5,0) | java.lang.Integer |
TEXT | VARCHAR2 CLOB | java.lang.String |
TIME | DATE | java.sql.Time |
TIMESTAMP | DATE | java.sql.Timestamp |
TINYBLOB | RAW | byte[] |
TINYINT | NUMBER(3,0) | java.lang.Boolean |
TINYTEXT | VARCHAR2 | java.lang.String |
VARCHAR | VARCHAR2 CLOB | java.lang.String |
YEAR | NUMBER | java.sql.Date |
MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比
关于 MySQL 整型显示位数的问题
int(M),tinyint(M),bigint(M),mediumint(M)、smallint(M)后面的 M 不代表占用空间容量(即存储的字符数),而是代表最小显示位数。也就是说int(1)和int(11)占用的是4个字节,tinyint(1)和tinyint(4)占用的是1个字节,和M值没有关系。
当存储的数值表面长度
小于M
值时,只有设置了zerofill
(表示用0来填充),才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。
举例子:
mysql> desc test;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id1 | tinyint(2) | YES | | NULL | |
| id2 | tinyint(1) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
id1是tinyint(2),我插入123
,行不行?
mysql> insert into test(id1,id2) values(123,2);
Query OK, 1 row affected (0.00 sec)mysql> select * from test;
+------+------+
| id1 | id2 |
+------+------+
| 123 | 2 |
+------+------+
1 row in set (0.00 sec)
可见是可以正常插入的。
tinyint(2)的2
到底有啥意义?我们插入5
看下效果:
mysql> insert into test values(5,10);
Query OK, 1 row affected (0.00 sec)mysql> select * from test;
+------+------+
| id1 | id2 |
+------+------+
| 123 | 2 |
| 5 | 10 |
+------+------+
2 rows in set (0.00 sec)
有没有发现,不论插入的数字表面位数超过2还是小于2,都没有任何影响,纳闷了,到底设置2
,干啥子呢?这就是奇葩了,想要看到效果,就必须用到zerofill
指令,如下:
mysql> alter table test modify id1 tinyint(2) zerofill; // 必须告诉数据库,显示位数不足2位时,前面要补0
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from test;
+------+------+
| id1 | id2 |
+------+------+
| 123 | 2 |
| 05 | 10 |
+------+------+
2 rows in set (0.00 sec)
这样就看到5
这个数值最后显示成05
了,这个意义大不大?不大,没啥意思!!!
如果不指定显示位数,MySQL数据库对于整数型默认分配的显示位数如下:
int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)
,但是默认情况下没啥意义,因为我们创建数据库的时候相关字段根本没有设定zerofill,所以就毫无效果!
关于 MySQL 的 timestamp
如果不给 timestamp 类型的字段赋值或者赋值 null,则默认保存当前系统时间
关于 JDBC 类型
ResultSet 对象中获取列的值的方法:
int id = rs.getInt("id");
String name = rs.getString("name");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date hiredate = rs.getDate("hiredate");
// salary 在数据库中的类型是 decimal
BigDecimal salary = rs.getBigDecimal("salary");
// bonus 在数据库中的类型是 decimal
BigDecimal bonus = rs.getBigDecimal("bonus");
int dept_id = rs.getInt("dept_id");
PreparedStatement 对象中的设置预编译 SQL 语句参数值的方法:
setByte(int parameterIndex, byte x)
setBlob(int parameterIndex, Blob x)
setDouble(int parameterIndex, double x)