MySql NOT NULL约束不起作用

Arc*_*Arc 3 php mysql null mysqli constraints

我试图在customer表中实现NOT NULL约束,该表创建为:

CREATE TABLE CUSTOMER(
     cust_id INT(5) NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY(cust_id),
     first_name VARCHAR(25) NOT NULL,
     last_name VARCHAR(25) NOT NULL,
     email VARCHAR(25) NOT NULL,
     password VARCHAR(25) NOT NULL,
     gender VARCHAR(1) NOT NULL,
     city VARCHAR(25) NOT NULL,
     dob DATE NOT NULL,
     pin INT NOT NULL);
Run Code Online (Sandbox Code Playgroud)

从表单中传递值后,我将其插入为:

$sql= "INSERT INTO customer(first_name,last_name,email,password,gender,city,dob,pin) VALUES('$first_name','$last_name','$email_add','$password','$gender','$city','$DOB','$pin')";
Run Code Online (Sandbox Code Playgroud)

但是,如果我传递字段的空白值,Mysql似乎插入它们?可能有什么问题?

pax*_*blo 5

我怀疑这是因为,在真正的DBMS中,而不是Oracle :-),空值和NULL值之间存在区别.

空字符串对NOT NULL字段完全有效.您不应该在NOT NULL字段中放置的唯一值是,挂起,试图记住,... NULL.对,就是那样.空值.:-)

除此之外:Oracle在很多时候做出了将空VARCHAR视为NULL的决定,它仍然困扰着它们(或者如果我不是唯一一个因为这个问题而拒绝使用它的人).

如果你希望你的PHP代码像Oracle一样工作(空白变成NULL),那么你将不得不预处理字符串,比如(伪代码):

if $first_name == "":
    $first_name = "NULL"
else:
    $first_name = "'" + $first_name + "'"
: : :
$sql= "INSERT INTO customer(" +
    "first_name," +
    "last_name," +
    "emailpassword," +
    "gender," +
    "city," +
    "dob," +
    "pin" +
    ") VALUES (" + 
        $first_name + "," +
        "'$last_name'" + "," +
        "'$email_add'" + "," +
        "'$password'" + "," +
        "'$gender'" +
        ",'$city'" + "," +
        "'$DOB'" + "," +
        "'$pin'" +
    ")";
Run Code Online (Sandbox Code Playgroud)

对于其他可以为NULL的字段等等.我只展示了如何做到这一点$first_name.

这将导致INSERT语句中的first_name列为单引号NULL$first_name由单引号括起的值.

请记住,应检查和/或修改所有这些字段以防止SQL注入攻击.