我有一个动态编写的查询(通过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','')
Run Code Online (Sandbox Code Playgroud)
但是,当我查看数据库表时,虽然ActivatedDT正确设置为NULL,但BalanceInit和BalanceCurrent都是0.00.ActivatedDT字段是日期时间,而另外两个是十进制(18,2),并且所有三个都在表结构中设置为默认值NULL.
如果我运行这样的查询:
UPDATE arrc_Voucher
SET BalanceInit = null
WHERE BalanceInit like "0%"
Run Code Online (Sandbox Code Playgroud)
...它确实将值设置为null,那么为什么初始插入查询不这样做呢?是因为null在引号中吗?如果是这样,为什么ActivatedDT设置正确?
删除周围的引号NULL.实际发生的是它试图将字符串'NULL'作为数字插入,并且因为它无法转换为数字而使用默认值0.
至于为什么ActivatedDT有效,我猜这是一个日期字段.无法将字符串转换为日期通常会导致将值设置为0(格式化为'1969-12-31'),但如果NO_ZERO_DATE启用了模式,则将其设置为NULL.
如果您希望MySQL在这种情况下抛出错误,当传递无效值时,您可以设置STRICT_ALL_TABLES或STRICT_TRANS_TABLES(确保您阅读有关它们之间差异的部分)或其中一种仿真模式,例如TRADITIONAL.
你可以用命令试试这个SET sql_mode='TRADITIONAL',或者通过增加sql-mode="TRADITIONAL"在my.cnf.