查询值中为NULL,在MySQL中产生0.00

时间:2010-10-29 18:09:27

标签: sql mysql null

我有一个动态编写的查询(通过Joomla的OO PHP)将一些值插入到MySQL数据库中。用户填写的表单上有一个字段用于金额,如果它们留空,我希望进入系统的值为NULL。我已经将错误日志中的查询写出来了;这就是查询的样子:

INSERT INTO arrc_Voucher 
  (VoucherNbr,securityCode,sequentialNumber, TypeFlag, CreateDT, ActivatedDT, BalanceInit,  BalanceCurrent, clientName)     
VALUES
  ('6032100199108006', '99108006','12','V','2010-10-29 12:50:01','NULL','NULL','NULL','')

但是,当我查看数据库表时,虽然ActivatedDT正确设置为NULL,但BalanceInit和BalanceCurrent都是0.00。 ActivatedDT字段是日期时间,而其他两个是十进制(18,2),并且所有三个都在表结构中设置为默认值NULL。

如果我运行这样的查询:

UPDATE arrc_Voucher 
   SET BalanceInit = null 
WHERE BalanceInit like "0%"

...它确实将值设置为null,那么为什么初始插入查询不这样做呢?是因为null在引号中吗?如果是这样,为什么它为ActivatedDT正确设置?

3 个答案:

答案 0 :(得分:6)

删除NULL周围的引号。实际发生的是它试图将字符串'NULL'作为数字插入,因为它无法转换为数字,所以它使用默认值0

至于为什么ActivatedDT有效,我猜这是一个日期字段。无法将字符串转换为日期通常会导致将值设置为0(其格式设置为'1969-12-31'),但如果您启用了NO_ZERO_DATE模式,则它将被设置为NULL

如果您希望MySQL在这种情况下抛出错误,当传递无效值时,您可以设置STRICT_ALL_TABLESSTRICT_TRANS_TABLES(请务必阅读有关它们之间差异的部分)或其中一种仿真模式,如TRADITIONAL

您可以使用SET sql_mode='TRADITIONAL'命令尝试此操作,或在sql-mode="TRADITIONAL"中添加my.cnf

答案 1 :(得分:3)

当您在MySQL数据库中插入NULL时,不能在其周围插入引号。它试图插入varchar'NULL'。如果您的想法奏效,您将永远无法将实际的单词NULL插入数据库。

如果要插入NULL,请删除单引号。

答案 2 :(得分:2)

您不是将字段设置为NULL,而是设置为字符串('NULL')。