【问题标题】:MySql NOT NULL Constraint doesnot workMySql NOT NULL 约束不起作用
【发布时间】:2009-05-11 06:43:02
【问题描述】:

我正在尝试在创建为的客户表中实现 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 似乎会插入它们?可能是什么问题?

【问题讨论】:

    标签: php mysql null constraints mysqli


    【解决方案1】:

    我怀疑这是因为在真正的 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'" +
        ")";
    

    其他也可以为 NULL 的字段以此类推。我只展示了如何为$first_name 做这件事。

    这将导致 INSERT 语句中的 first_name 列是 NULL$first_name 的值,并用单引号括起来。

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

    【讨论】:

    • 我怎样才能正确?我以前使用过oracle ..正在尝试MYSQL并有点挣扎。如何从表单中传递空值??
    • 本示例代码("'" + $first_name + "'") 用于SQL注入攻击。您必须在 $first_name 中转义引号和反斜杠(对于 MySQL,使用 addlashes($first_names) 除非魔术引号已经这样做了)。
    • @pts,代码本身就有这个漏洞,是的,它应该被修复,但这不是问题所在。
    • @pts - 您应该始终使用 PHP 转义函数来处理字符串,在这种情况下,您应该使用 mysql_real_escape_string 而不是添加斜杠。
    【解决方案2】:
    $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,所以不会插入任何内容。

    【讨论】:

      【解决方案3】:

      来自此处文档的一些附加信息:

      http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多