查询值中为NULL,在MySQL中产生0.00

Emm*_*myS 3 mysql sql null

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

Bra*_*ace 6

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