zoukankan      html  css  js  c++  java
  • 1364:Field 'sex' doesn't have a default value [ SQL语句 ]

    1364:Field 'sex' doesn't have a default value [ SQL语句 ]

     

    错误解决方法:

    关闭MySQL的strict mode的具体做法:

    找到MySQL目录下的my.ini,将其中的sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 修改为sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",重新启动 Mysql服务

     

    造成问题的原因:

    一. Strict Mode的描述:

    根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制:

    1).不支持对not null字段插入null值

    2).不支持对自增长字段插入''值,可插入null值

    3).不支持 text 字段有默认值

    eg:

    1.看下面代码:(第一个字段为自增字段)

    $query="insert into demo values('','$firstname','$lastname','$sex')";

    上边代码只在非strict模式有效,如果是strict模式下就会出错。

     

    2.$query="insert into demo values(NULL,'$firstname','$lastname','$sex')";

    上边代码只在strict模式有效。把空值''换成了NULL.

     

    二. 让数据库支持Strict Mode:

    1.对数据库结构进行以下改进来支持strict mode:

    1) 给所有not null字段都设置非null默认值,字符串默认值为 '',数值默认值为 0,日期默认值为 '0000-00-00 00:00:00'

    2) 去掉text字段的默认值

    3) 规范化改进: 把 title 字段统一改为 varchar(255),把有默认值的null字段改为not null字段

     

    2.如果安装的PHP程序数据库结构关闭Strict mode

    1).一个是安装mysql5.0(含以上)版本的时候去掉strict mode。

    编辑 my.ini,关闭Strict Mode:

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

     

    2). 另一个就是修改查询语句。例如在

    if ($this->dbcharset) {

    @mysql_query("SET NAMES ".$this->dbcharset);

    }

    后面执行

    mysql_query("SET @@sql_mode = ''");

     

    注意确定你使用的是MySQL5 以上版本

     

    mysqli方式类似,就是执行的是

    mysqli_query($this->connection_id, "SET @@sql_mode = ''");

     

    MySQL 1364 错误提示:#1364 - Field "XX" doesn't have a default value

    MySQL 1364 错误提示:#1364 - Field "details" doesn't have a default value。

    大概意思是:details字段没有默认的数值;也就是说我们没有为其分配数值,而表中此字段也没有设置默认值。

    这是MySQL5出来后搞出来的东东,认真看一下my.ini文件中有这样一段:

    my.ini中相关代码

    # Set the SQL mode to strict

    # sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    假如您无法看到my.ini,你可以执行以下SQL命令。

    SQL代码

    SELECT @@GLOBAL.sql_mode;

    您可能一下子就注意到:STRICT_TRANS_TABLES(存储引擎启用严格模式,非法数据值被拒绝)。这也就是为什么我们插入数据时返回1364的原因:details字段没有设置默认值。

    解决办法有两种:

    第一种:数据库设计时,可能没有数据的字段设置默认值。

    第二种:设置SQL的模式,此有两种方法:

    (1),配置my.ini,去掉:STRICT_TRANS_TABLES 重新启动mysql服务

    my.ini配置代码

    # Set the SQL mode to strict

    # sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    (2),运行SQL命令。注:此命令需要权限!

    SQL代码

    SET @@GLOBAL.sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

     

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------

     

     

    解决方法一:

    如果是直接用sql语句进行操作mysql,可加上 set sql_mode=";

    即可.dedecms采集就是这么做的

    解决方法二:

    打开my.ini,查找

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    修改为

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    然后重启MYSQL

    解决方法三:

    MySQL 5 uses a strict mode which needs to be disabled.

    In Windows, Goto Start–>Programs–>MySQL->MySQL Instance Config Wizard. Follow through the Reconfigure Instance option–>Detailed Configuration–>Continue Next a few screens. At the bottom under Enable TCP/IP option there is 'Enable Strict Mode'. Deslect this option (no tick). Save changes and MySQL will restart

      原来在MySQL 5.0.2之前,MySQL对非法或不当值并不严厉,而且为了数据输 入还会强制将它们变为合法值。在MySQL 5.0.2和更高版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够 拒绝并放弃出现不良值的语句。本节介绍了MySQL的默认行为(宽大行为),新的严格的SQL模式,以及它们的区别。

      如果你未使用严格模式,下述情况是真实的。如果将"不正确"的值插入到列,如将NULL值插入非NULL列,或将过大的数值插入数值列,MySQL会将这些列设置为"最可能的值",而不是生成错误信息。

      · 如果试图将超范围的值保存到数值列,MySQL服务器将保存0(最小的可能值)取而代之,或最大的可能值。

      · 对于字符串,MySQL或保存空字符串,或将字符串尽可能多的部分保存到列中。

      · 如果打算将不是以数值开头的字符串保存到数值列,MySQL将保存0。

       · MySQL允许将特定的不正确日期值保存到DATE和DATETIME列(如"2000-02-31"或"2000-02-00")。其观点在于, 验证日期不是SQL服务器的任务。如果MySQL能保存日期值并准确检索相同的值,MySQL就能按给定的值保存它。如果日期完全不正确(超出服务器能保 存的范围)将在列中保存特殊的日期值"0000-00-00"取而代之。

      · 如果试图将NULL值保存到不接受NULL值的列,对于单行 INSERT语句,将出现错误。对于多行INSERT语句或INSERT INTO … SELECT语句,MySQL服务器会保存针对列数据类型的隐含 默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串("),对于日期和时间类型是"zero"。

      · 如果INSERT语句未为列指定值,如果列定义包含明确的DEFAULT子句,MySQL将插入默认值。如果在定义中没有这类DEFAULT子句,MySQL会插入列数据类型的隐含默认值。

       采用前述规则的原因在于,在语句开始执行前,无法检查这些状况。如果在更新了数行后遇到这类问题,我们不能仅靠回滚解决,这是因为存储引擎可能不支持回 滚。中止语句并不是良好的选择,在该情况下,更新完成了"一半",这或许是最差的情况。对于本例,较好的方法是"仅可能做到最好",然后就像什么都未发生 那样继续。

      在MySQL 5.0.2和更高版本中,可以使用STRICT_TRANS_TABLES或STRICT_ALL_TABLES SQL模式,选择更严格的处理方式。

      STRICT_TRANS_TABLES的工作方式:

      · 对于事务性存储引擎,在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。

       · 对于非事务性存储引擎,如果错误出现在要插入或更新的第1行,将放弃语句。(在这种情况下,可以认为语句未改变表,就像事务表一样)。首行后出现的 错误不会导致放弃语句。取而代之的是,将调整不良数据值,并给出告警,而不是错误。换句话讲,使用STRICT_TRANS_TABLES后,错误值会导 致MySQL执行回滚操作,如果可以,所有更新到此为止。

      要想执行更严格的检查,请启用STRICT_ALL_TABLES。除了非事务性存 储引擎,它与STRICT_TRANS_TABLES等同,即使当不良数据出现在首行后的其他行,所产生的错误也会导致放弃语句。这意味着,如果错误出现 在非事务性表多行插入或更新过程的中途,仅更新部分结果。前面的行将完成插入或更新,但错误出现点后面的行则不然。对于非事务性表,为了避免这种情况的发 生,可使用单行语句,或者在能接受转换警告而不是错误的情况下使用STRICT_TRANS_TABLES。要想在第1场合防止问题的出现,不要使用 MySQL来检查列的内容。最安全的方式(通常也较快)是,让应用程序负责,仅将有效值传递给数据库。

      有了严格的模式选项后,可使用INSERT IGNORE或UPDATE IGNORE而不是不带IGNORE的INSERT或UPDATE,将错误当作告警对待。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/lovebing/p/6830407.html
Copyright © 2011-2022 走看看