# 创建一个my_time表
- create table if not exists my_time
-
(
-
id integer not null,
-
mytime time not null,
-
primary key (id)
-
);
# 插入数据
- insert into my_time values
-
(
-
1,'12:30:30'
-
);
-
insert into my_time values
-
(
-
2,'123030'
-
);
-
insert into my_time values
-
(
-
3,'323030'
-
);
# 查看结果:
- select * from my_time;
-
'1', '12:30:30'
-
'2', '12:30:30'
-
'3', '32:30:30'
====================================
问题:
'3', '32:30:30' 这个合法性如何保证?
这样插入是不允许的
- insert into my_time values
-
(
-
4,'42-32-30'
-
);
但是这样插入可以:
- insert into my_time values
-
(
-
3,'323030'
-
);
怎么样能够解决这个问题? 在创建表my_time的时候可以对 mytime time not null 做限制吗?
====================================
解答:
感谢指导!
1,首先了解一下mysql中的Time类型的格式(手册里有),'HHH:MM:SS'和‘HH:MM:SS'格式)。TIME值的范围可以从'-838:59:59'到'838:59:59'
小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。
所以HHHMMSS类型的串或者数字,像你的323030插入后会变成32:30:30的原因。
2,如果插入的格式不合法,像你的‘42-32-30’格式,在非严格模式下,mysql是允许操作,会有一个Warning,不过,插入后变成“00:00:00“,但如果在严格模式下,不允许插入并提示错。
如下面
表结构,
- mysql> show create table Time_t\G;
-
*************************** 1. row ***************************
-
Table: Time_t
-
Create Table: CREATE TABLE `time_t` (
-
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-
`my_time` time NOT NULL,
-
PRIMARY KEY (`id`)
-
) ENGINE=MyISAM DEFAULT CHARSET=latin1
-
1 row in set (0.00 sec)
当前模式:
- mysql> select @@sql_mode;
-
+------------+
-
| @@sql_mode |
-
+------------+
-
| |
-
+------------+
-
1 row in set (0.00 sec)
插入分钟不规则的时间:
- mysql> insert into Time_t values(null,'42:333:10');
-
Query OK, 1 row affected, 1 warning (0.00 sec)
允许插入,格式化为00:00:00
- mysql> select * from Time_t;
-
+----+----------+
-
| id | my_time |
-
+----+----------+
-
| 2 | 00:00:00 |
-
+
(2)在严格模式下
- mysql> set @@sql_mode='STRICT_TRANS_TABLES';
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql> select @@sql_mode;
-
+---------------------+
-
| @@sql_mode |
-
+---------------------+
-
| STRICT_TRANS_TABLES |
-
+---------------------+
-
1 row in set (0.00 sec)
已不允许插入:
- mysql> insert into Time_t values(null,'42:233:10');
-
ERROR 1292 (22007): Incorrect time value: '42:233:10' for column 'my_time' at row 1
说明:sql_mode根据你的系统来定,觉得这个时间值 的控制还是放在应用程序里,在插入之前进行处理好一些。
阅读(15750) | 评论(0) | 转发(0) |