我有一个动态编写的查询(通过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正确设置?
答案 0 :(得分:6)
删除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
。
答案 1 :(得分:3)
当您在MySQL数据库中插入NULL时,不能在其周围插入引号。它试图插入varchar'NULL'。如果您的想法奏效,您将永远无法将实际的单词NULL插入数据库。
如果要插入NULL,请删除单引号。
答案 2 :(得分:2)
您不是将字段设置为NULL
,而是设置为字符串('NULL'
)。