我有一个动态编写的查询(通过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正确设置?
删除周围的引号NULL。实际上发生的是它试图将字符串'NULL'作为数字插入,并且由于不能将其转换为数字,因此使用默认值0。
NULL
'NULL'
0
至于为什么ActivatedDT起作用,我猜这是一个日期字段。未能将字符串转换为日期通常会导致将值设置为0(将其格式化为类似“ 1969-12-31”的格式),但是如果NO_ZERO_DATE启用了模式,则将其设置为NULL。
NO_ZERO_DATE
如果您希望MySQL在这种情况下引发错误,则在传递无效值时,可以设置STRICT_ALL_TABLES或STRICT_TRANS_TABLES(确保您已阅读有关它们之间差异的部分)或一种仿真模式,例如TRADITIONAL。
STRICT_ALL_TABLES
STRICT_TRANS_TABLES
TRADITIONAL
你可以用命令试试这个SET sql_mode='TRADITIONAL',或者通过增加sql- mode="TRADITIONAL"在my.cnf。
SET sql_mode='TRADITIONAL'
sql- mode="TRADITIONAL"
my.cnf