MySql的NOT NULL约束不起作用。

3

我正在尝试在客户表中实现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);

我从一个表单中传递了值,并将其插入为:

$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')";

然而,如果我传递字段的空值,Mysql似乎会将它们插入?可能的问题是什么?
3个回答

5
我怀疑这是因为在真正的DBMS中,与Oracle不同,空值和NULL值是有区别的。
对于“NOT NULL”字段,空字符串是完全有效的。唯一不能放入“NOT NULL”字段的值是,等等,尝试记住......NULL。是的,就是它。NULL。
另外:很久以前,Oracle决定将空的VARCHAR视为空值,这仍然困扰着他们(如果我不是因为这个问题拒绝使用它的话)。
如果您希望您的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'" +
    ")";

其他字段也可能为空,同样可以采用相同方法。我只展示了如何处理$first_name字段。

这将导致INSERT语句中的first_name列为NULL或被单引号包围的$first_name的值。

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


我该怎么做才能搞定它??我以前用过Oracle..现在正在尝试使用MYSQL,但有些困难。我该如何从表单中传递空值?? - Arc
这段示例代码("'" + $first_name + "'")容易受到SQL注入攻击。你必须转义$first_name中的引号和反斜杠(对于MySQL,请使用addslashes($first_names),除非魔术引号已经完成了这个任务)。 - pts
@pts,代码本身存在漏洞,是的,应该修复,但这不是问题的关键。 - paxdiablo
@pts - 你应该始终使用特定于字符串操作的PHP转义函数,例如在这种情况下,你应该使用mysql_real_escape_string而不是addslashes。 - tloach

3
$sql= "INSERT INTO customer(first_name,last_name,email,password,gender,city,dob,pin) VALUES('$first_name',".
($last_name?"'".$last_name."'":"NULL").
", '$email_add','$password','$gender','$city','$DOB','$pin')";

这将是:

VALUES('ahm',NULL,'email@a.ddr' ...

由于 NOT NULL 的限制,将不会插入任何内容。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接