一尘不染

查询值为NULL,导致MySQL中为0.00

sql

我有一个动态编写的查询(通过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正确设置?


阅读 160

收藏
2021-03-08

共1个答案

一尘不染

删除周围的引号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

2021-03-08