Chinaunix首页 | 论坛 | 博客
  • 博客访问: 482959
  • 博文数量: 71
  • 博客积分: 1332
  • 博客等级: 少尉
  • 技术积分: 772
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 16:25
个人简介

文章分类

全部博文(71)

文章存档

2013年(19)

2012年(9)

2011年(43)

分类: Mysql/postgreSQL

2012-03-04 23:58:49

# 创建一个my_time表
  1. create table if not exists my_time
  2. (
  3.     id integer not null,
  4.     mytime time not null,
  5.     primary key (id)
  6. );

# 插入数据
  1. insert into my_time values
  2. (
  3.     1,'12:30:30'
  4. );
  5. insert into my_time values
  6. (
  7.     2,'123030'
  8. );
  9. insert into my_time values
  10. (
  11.     3,'323030'
  12. );

# 查看结果:
  1. select * from my_time;
  2. '1', '12:30:30'
  3. '2', '12:30:30'
  4. '3', '32:30:30'



====================================
问题:

'3', '32:30:30' 这个合法性如何保证?

这样插入是不允许的
  1. insert into my_time values
  2. (
  3.     4,'42-32-30'
  4. );

但是这样插入可以:
  1. insert into my_time values
  2. (
  3.     3,'323030'
  4. );



怎么样能够解决这个问题? 在创建表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“,但如果在严格模式下,不允许插入并提示错。
如下面

表结构,
  1. mysql> show create table Time_t\G;
  2. *************************** 1. row ***************************
  3.        Table: Time_t
  4. Create Table: CREATE TABLE `time_t` (
  5.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  6.   `my_time` time NOT NULL,
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1
  9. 1 row in set (0.00 sec)


当前模式:
  1. mysql> select @@sql_mode;
  2. +------------+
  3. | @@sql_mode |
  4. +------------+
  5. | |
  6. +------------+
  7. 1 row in set (0.00 sec)


插入分钟不规则的时间:
  1. mysql> insert into Time_t values(null,'42:333:10');
  2. Query OK, 1 row affected, 1 warning (0.00 sec)

允许插入,格式化为00:00:00
  1. mysql> select * from Time_t;
  2. +----+----------+
  3. | id | my_time |
  4. +----+----------+
  5. | 2 | 00:00:00 |
  6. +
(2)在严格模式下

  1. mysql> set @@sql_mode='STRICT_TRANS_TABLES';
  2. Query OK, 0 rows affected (0.00 sec)

  3. mysql> select @@sql_mode;
  4. +---------------------+
  5. | @@sql_mode |
  6. +---------------------+
  7. | STRICT_TRANS_TABLES |
  8. +---------------------+
  9. 1 row in set (0.00 sec)


已不允许插入:
  1. mysql> insert into Time_t values(null,'42:233:10');
  2. ERROR 1292 (22007): Incorrect time value: '42:233:10' for column 'my_time' at row 1

说明:sql_mode根据你的系统来定,觉得这个时间值 的控制还是放在应用程序里,在插入之前进行处理好一些。

阅读(1396) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~