【问题标题】:mysql warningsmysql 警告
【发布时间】:2009-04-26 13:08:25
【问题描述】:

我有下表:

 CREATE TABLE `events` (
  `evt_id` int(11) NOT NULL AUTO_INCREMENT,
  `evt_name` varchar(50) NOT NULL,
  `evt_description` varchar(100) DEFAULT NULL,
  `evt_startdate` date NOT NULL,
  `evt_enddate` date DEFAULT NULL,
  `evt_starttime` time DEFAULT NULL,
  `evt_endtime` time DEFAULT NULL,
  `evt_amtpersons` int(11) DEFAULT NULL,
  `sts_id` int(11) NOT NULL,
  `adr_id` int(11) DEFAULT NULL,
  `evt_amtPersonsSubs` int(11) DEFAULT NULL,
  `evt_photo` varchar(50) DEFAULT NULL,
  `sys-mut-dt` timestamp NULL DEFAULT NULL,
  `sys-mut-user` varchar(20) DEFAULT NULL,
  `sys-mut-id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`evt_id`),
  KEY `sts_id` (`sts_id`),
  KEY `adr_id` (`adr_id`),
  CONSTRAINT `sts_id` FOREIGN KEY (`sts_id`) REFERENCES `statusses` (`sts_id`) O
N DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1

现在我有两个问题:

这是我的查询:

INSERT INTO `events`(`evt_name` , `evt_description` , `evt_startdate` , `evt_enddate` , `evt_starttime` , `evt_endtime` , `evt_amtpersons` , `sts_id` , `adr_id` , `evt_amtPersonsSubs` , `evt_photo` , `sys-mut-user` , `sys-mut-id`) VALUES ('asf' , 'asf' , '2009-04-02' , '2009-04-22' , '00:00:00' , '00:00:00' , '3' , '1' , '' , '' , '' , 'test' , '1')
  1. 当我通过我的 php 程序执行此查询时,我没有收到任何错误。但是当我直接在 mysql 数据库上的 shell 中执行查询时,我收到两个警告。当有警告时,我如何让 PHP 提醒我,因为如果有警告,mysql 不会插入。

  2. 关于警告:

|警告 |第1366章不正确的整数值:第 1 行的列 'adr_id' 的 '' |警告 |第1366章不正确的整数值:'' 列 'evt_amtPersonsSubs' 在第 1 行

我怎样才能摆脱这些警告。尝试进行一些更改,但到目前为止没有成功。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    您正在插入一个空字符串。您应该删除 '' 并在该字段中输入一个数字

    正如您所说,插入时不必指定该列的值。在创建表时该列的“DEFAULT NULL”指示了这一事实。然而,这一事实意味着,如果您在执行 INSERT 时 在列列表中指定列名(因此您也不会指定相应的值),那么无论如何都可以插入元组,并且对于该列值,默认情况下您将自动获得 NULL。

    但是,在您的查询中,您指定要插入该列值,并且您说的列值是 ''(一个空字符串)。这当然是无效的,因为该列接受整数(或 NULL,因为您没有声明该列 NOT NULL),并且空字符串是空字符串,而不是整数。

    SQL 服务器很慷慨,无论如何都会接受空字符串(可能会将其强制转换为零),但会向您报告一个警告。如果您为服务器设置严格模式(我强烈建议您这样做),您将收到错误并且插入将失败。

    请注意,如果您遵循我设置严格模式的建议,这是服务器范围的,涉及您所有的数据库和所有表(至少一年前发布的 mysql)。如果您编写的软件需要宽容的服务器,那么您将无法使用它。

    【讨论】:

      【解决方案2】:

      错误消息告诉您空字符串 ('') 不是整数字段的有效值 - 在本例中为字段 adr_idevt_amtPersonsSubs。你的意思是用 NULL 代替吗?

      在 PHP 中,您可以使用 mysql_error() 函数检索错误或警告消息,仅针对最近的查询。

      【讨论】:

        【解决方案3】:

        '' 不是整数......如果你真的想要一个空值,那么在查询中使用 NULL 怎么样?

        【讨论】:

          【解决方案4】:

          警告告诉您,您正在尝试将字符串值插入整数列。

          在所有你有一个 int 列的地方,你不能把值放在 ' 之间,而只是把值放在原样

          [...]'00:00:00' , '00:00:00' , 3 , 1 , [...]

          如果您不想为某个列提供值,则应将该列定义为 NULL。然后你甚至可以把你的''留给插入。

          但是

          一般来说,做这样的插入是不好的做法。如果有一天您需要在表格中添加一列怎么办?然后你也必须去重写你的代码。

          因此你应该做这样的插入:

          INSERT INTO tbl_name (col1, col2) VALUES(value1, value2);
          

          这样,即使您决定添加列,您的代码仍然可以工作。加上代码更容易阅读!!

          【讨论】:

            【解决方案5】:

            隐式默认定义如下:

            • 对于数字类型,默认值为 0,但使用 AUTO_INCREMENT 声明的整数或浮点类型除外 属性,默认是序列中的下一个值。

            参考:

            【讨论】:

              猜你喜欢
              • 2011-01-07
              • 1970-01-01
              • 2017-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多