MySQL忽略了NOT NULL约束

Wha*_*kee 10 php mysql constraints

我创建了一个NOT NULL对MySQL中的某些列有约束的表.然后在PHP中我编写了一个插入数据的脚本,带有插入查询.当我省略NOT NULL这个insert语句中的一个列时,我会期望来自MySQL的错误消息,我希望我的脚本失败.相反,MySQL在NOT NULL字段中插入空字符串.在其他省略的字段中,数据为NULL,这很好.有人能告诉我这里做错了吗?

我正在使用这张桌子:

CREATE TABLE IF NOT EXISTS tblCustomers (
  cust_id int(11) NOT NULL AUTO_INCREMENT,
  custname varchar(50) NOT NULL,
  company varchar(50),
  phone varchar(50),
  email varchar(50) NOT NULL,
  country varchar(50) NOT NULL,
  ...
  date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (cust_id)
) ;
Run Code Online (Sandbox Code Playgroud)

这个插入声明:

$sql = "INSERT INTO tblCustomers (custname,company) 
        VALUES ('".$customerName."','".$_POST["CustomerCompany"]."')";
$res = mysqli_query($mysqli, $sql);
Run Code Online (Sandbox Code Playgroud)

或者使用绑定变量:

$stmt = mysqli_prepare($mysqli, "INSERT INTO tblCustomers (custname,company, email, country) VALUES (?, ?, ?, ?)");

mysqli_stmt_bind_param($stmt, 'ssss', $customerName, $_POST["CustomerCompany"], $_POST["CustomerEmail"], $_POST["AddressCountry"]);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ams 16

如果您确定没有使用显式默认值,请检查严格模式:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
Run Code Online (Sandbox Code Playgroud)

MySQL数据类型默认值

从MySQL 5.0.2开始,如果列定义不包含显式DEFAULT值,MySQL将确定默认值,如下所示:

如果列可以将NULL作为值,则使用显式DEFAULT NULL子句定义该列.这与5.0.2之前相同.

如果列不能将NULL作为值,则MySQL定义没有显式DEFAULT子句的列.对于数据输入,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将列设置为NULL,则MySQL将根据当时生效的SQL模式处理该列:

  • 如果未启用严格的SQL模式,MySQL会将列设置为列数据类型的隐式默认值.

  • 如果启用了严格模式,则事务表会发生错误,并且会回滚该语句.对于非事务性表,会发生错误,但如果多行语句的第二行或后续行发生这种情况,则会插入前面的行.

服务器SQL模式


Mar*_*ers 5

您做错的是使用字符串而不是使用绑定参数来构建查询。

除了SQL注入漏洞外,空值甚至在数据库看到它们之前就被转换为空字符串。

$x = null;
print_r("VALUES ('$x', 42)");
Run Code Online (Sandbox Code Playgroud)

输出:

VALUES ('', 42)
Run Code Online (Sandbox Code Playgroud)

换句话说,您要插入一个空字符串,而不是NULL。要插入NULL,您将需要编写以下代码:

VALUES (NULL, 42)
Run Code Online (Sandbox Code Playgroud)

如果使用绑定参数,则不会出现此问题,此外,您的站点不会有太多安全漏洞。我建议您阅读该问题的答案并按照那里的建议进行操作。这将解决您眼前的问题,并提高您网站的安全性。