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,将错误当作告警对待。
1364:Field 'sex' doesn't have a default value [ SQL语句 ]的更多相关文章
- string(81) "SQLSTATE[HY000]: General error: 1364 Field 'content' doesn't have a default value"
mysql版本是5.7.26,在插入数据时报错: string(81) "SQLSTATE[HY000]: General error: 1364 Field 'content' doesn ...
- legend2---数据字段没有默认值错误:SQLSTATE[HY000]: General error: 1364 Field 'h_21_injury_limit' doesn't have a default value
legend2---数据字段没有默认值错误:SQLSTATE[HY000]: General error: 1364 Field 'h_21_injury_limit' doesn't have a ...
- MySQL 1364 错误提示:#1364 - Field "details" doesn't have a default value
原因:mysql字段设计的时候为not null,结果此字段没有插入值,解决方法: 运行以下命令. SET @@GLOBAL.sql_mode="NO_AUTO_CREATE_USER,NO ...
- mysql Field xxx doesn't have a default value STRICT_TRANS_TABLES(存储引擎启用严格模式,非法数据值被拒绝)
今天在插入一条数据时发生错误: Field serverid doesn’t have a default value. serverid是设置成了not null int类型的,但是插入的是'',就 ...
- Field "details" doesn't have a default value
[转载:原文链接http://my.oschina.net/wojibuzhu/blog/511104] MySQL 1364 错误提示:#1364 - Field "details&quo ...
- Caused by: java.sql.SQLException: Field 'category_id' doesn't have a default value
### The error may involve com.qingmu.core.dao.ad.ContentDao.insertSelective-Inline ### The error occ ...
- [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 解决方法
在MySQL数据库中的mysql.user表中使用insert语句添加新用户时,可能会出现以下错误: ERROR 1364 (HY000): Field 'ssl_cipher' doesn't ha ...
- 错误号:1364 错误信息:Field 'platId' doesn't have a default value
1. 错误描述 错误号:1364 错误信息:Field 'platId' doesn't have a default value insert into `use`.`t_platform_scal ...
- [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
From: http://m.blog.csdn.net/blog/langkeziju/13511411 我的MySQL版本为5.6.14版本,是二进制包安装的(虽然是二进制包安装的,但是以下问题同 ...
随机推荐
- TCP 粘包及其解决方案(zz)
首先,我们回顾一下 TCP 和 UDP 的头部信息: 具体说明看:http://www.cnblogs.com/aomi/p/7776582.html 我们知道,TCP 和 UDP 是 TCP/IP ...
- 对tmemorystream的一些改进_delphi教程
http://www.cnblogs.com/linyawen/archive/2010/12/11/1903072.html 怎么又是关于Stream的,呵呵,应该说只是最近比较关心程式的效率问题, ...
- Win10系统激活工具失败错误0xC004C003解决方法
用了几个WIN10的激活工具 都提示 错误0xC004C003 都原因就是这些CDKEY都被拉入了黑名单 鼠标左击屏幕左下角WIN图标,直接输入cmd,在弹出的 命令提示符 右击 以管理员运行(因为 ...
- 部署web应用到虚拟主机的三种方式
方式一: 在 [tomcat]/conf/server.xml 文件中的<Engine>标签下的<Host>标签内部, 添加一个 <Context ...
- Unity3D实现DoubleClick的一种方法
代码简单粗暴如下: void OnMouseDown() { ) { t2 = DateTime.Now; , , , , )) //时间间隔小于500ms,认为是双击 { // 双击后的操作 } t ...
- 洛谷 P1012 拼数 [字符串]
题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...
- HDU 1558 Segment set(并查集)
题意: 给你一些线段的起点和终点的坐标,最后问和某个线段相连的或者间接相连的线段有多少个(包括本身)? P X1 Y1X2 Y2 起点(X1,X2)终点(X2,Y2):按照出现次数依次编号为1,2, ...
- cogs 双服务点设置
4. 双服务点设置 ☆ 输入文件:djsb.in 输出文件:djsb.out 简单对比时间限制:1 s 内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立两 ...
- HTTP状态代码集
所有 HTTP 状态代码及其定义. 代码 指示 2xx 成功 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 正常:已接受用于处 ...
- codeforces 314E Sereja and Squares
discription Sereja painted n points on the plane, point number i (1 ≤ i ≤ n) has coordinates (i, 0). ...