我有一个动态编写的查询(通过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.
至于为什么ActivatedDT有效,我猜这是一个日期字段.未能字符串转换成日期通常会导致其值设置为0(被格式化为像“1969-12-31”),但如果你已经启用了NO_ZERO_DATE模式,那么它将被设置为NULL而不是.
如果您想的MySQL抛出一个错误在这样的情况下,当无效值传递,您可以设置STRICT_ALL_TABLES或STRICT_TRANS_TABLES(请确保您了解它们之间的区别的部分)仿真模式中的一种,如TRADITIONAL或.
你可以用命令SET的sql_mode =“传统”,或者在my.cnf中添加SQL模式=“传统”的尝试.
标签:mysql,sql,null
来源: https://codeday.me/bug/20190717/1483816.html