阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle中date类型对应 MySQL 时间类型以及空值的处理

139次阅读
没有评论

共计 3509 个字符,预计需要花费 9 分钟才能阅读完成。

因为在做 Oracle—->MySQL 的数据迁移的时候,发现 Oracle 中的 date 类型,对应的 MySQL 的时间类型设置不当容易引起错误,特别是存在空值的时候

MySQL 版本 5.6.40 版本

mysql> desc t1;
+————-+———–+——+—–+——————-+—————————–+
| Field | Type | Null | Key | Default | Extra |
+————-+———–+——+—–+——————-+—————————–+
| id | int(11) | NO | PRI | NULL | auto_increment |
| time_1 | time | YES | | NULL | |
| date_2 | date | YES | | NULL | |
| datetime_3 | datetime | YES | | NULL | |
| timestamp_4 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+————-+———–+——+—–+——————-+—————————–+
5 rows in set (0.00 sec)

可以插入当前的时间

mysql> insert into t1 values(null,now(),now(),now(),now());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+——-+——+————————————————————————–+
| Level | Code | Message |
+——-+——+————————————————————————–+
| Note | 1292 | Incorrect date value: ‘2018-05-11 11:18:41’ for column ‘date_2’ at row 1 |
+——-+——+————————————————————————–+
1 row in set (0.00 sec)

提示 date 类型插入告警,但是依旧可以插入进去,因为 date 类型只记录年月(yyyy-mm)

Query OK, 1 row affected (0.01 sec)

4 个时间空值插入测试,time 类型,插入 0

mysql> insert into t1 values (null,’0′,’2018-01-01′,’2018-01-01 12:12:12′,’2018-10-10 00:00:00′);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+—-+———-+————+———————+———————+
| id | time_1 | date_2 | datetime_3 | timestamp_4 |
+—-+———-+————+———————+———————+
| 1 | 22:21:23 | 2018-05-08 | 2018-05-08 22:21:23 | 2018-05-08 22:21:23 |
| 2 | 22:21:54 | 2018-05-08 | 2018-05-08 22:21:54 | 2018-05-08 22:21:54 |
| 3 | 00:00:00 | 2018-01-01 | 2018-01-01 12:12:12 | 2018-10-10 00:00:00 | time_1 自动填充为 00:00:00
| 4 | 00:00:00 | 2018-01-01 | 2018-01-01 12:12:12 | 2018-10-10 00:00:00 |
+—-+———-+————+———————+———————+
4 rows in set (0.00 sec)

接着全部插入 0,看是否能够插入进去

测试 date 类型 —————
第三列为 date 类型

mysql> insert into t1 values(null,’0′,’0′,’0′,’0′); 插入 0
ERROR 1292 (22007): Incorrect date value: ‘0’ for column ‘date_2’ at row 1

mysql> insert into t1 values(null,’0′,”,’0′,’0′); 插入‘’测试,留空白,测试插入
ERROR 1292 (22007): Incorrect date value: ” for column ‘date_2’ at row 1

mysql> insert into t1 values(null,’0′,’null’,’0′,’0′); 插入 null 测试
ERROR 1292 (22007): Incorrect date value: ‘null’ for column ‘date_2’ at row 1

————- 测试 datetime 类型 –
第四列为 datetime 类型
mysql> insert into t1 values(null,’0′,null,’0′,’0′);
ERROR 1292 (22007): Incorrect datetime value: ‘0’ for column ‘datetime_3’ at row 1
插入 null 成功
——— 测试 timestamp 类型
第五列为 timestamp
mysql> insert into t1 values(null,’0′,null,null,’0′);
ERROR 1292 (22007): Incorrect datetime value: ‘0’ for column ‘timestamp_4’ at row 1
mysql> insert into t1 values(null,’0′,null,null,null);
Query OK, 1 row affected (0.00 sec)

插入 null 成功

mysql> select * from t1;
+—-+———-+————+———————+———————+
| id | time_1 | date_2 | datetime_3 | timestamp_4 |
+—-+———-+————+———————+———————+
| 1 | 22:21:23 | 2018-05-08 | 2018-05-08 22:21:23 | 2018-05-08 22:21:23 |
| 2 | 22:21:54 | 2018-05-08 | 2018-05-08 22:21:54 | 2018-05-08 22:21:54 |
| 3 | 00:00:00 | 2018-01-01 | 2018-01-01 12:12:12 | 2018-10-10 00:00:00 |
| 4 | 00:00:00 | 2018-01-01 | 2018-01-01 12:12:12 | 2018-10-10 00:00:00 |
| 5 | 00:00:00 | NULL | NULL | 2018-05-08 22:33:22 |
+—-+———-+————+———————+———————+
5 rows in set (0.00 sec)

总结:Oracle 数据库的 date 类型和 mysql 的 date 类型是不一样的,Oracle 为 yyyy-mm-dd hh:mi:ss 和 mysql 中的 datetime 类型匹配,而 mysql 为 yyyy-mm。当在存在空值的时候,mysql 的 time 类型可以使用 0 零来插入,而 date,datetime,timestamp 可以使用 null 来插入,但是 timestamp 即使为 null,也会默认插入当前时间戳。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3509字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中