Mysql 不为null,但仍获取“0”;字段';日期';不';“没有默认值”;
我在Rails 5.2.1+MySQL 5.7.23上创建了一个Mysql 不为null,但仍获取“0”;字段';日期';不';“没有默认值”;,mysql,ruby-on-rails,Mysql,Ruby On Rails,我在Rails 5.2.1+MySQL 5.7.23上创建了一个date\u字段表单,我收到一个错误,说“字段'date'没有默认值”。 我用谷歌搜索了一下,我知道每当我们试图在没有默认值的列中插入null时,MySQL 5.6+就会出现这个错误。 然而,在我的例子中,我选择了一个日期,使其不为空,并且仍然得到相同的错误 my new.erb: <%= form_for @post, :url => {:action => :create} do |f| %> <
date\u字段
表单,我收到一个错误,说“字段'date'没有默认值”。我用谷歌搜索了一下,我知道每当我们试图在没有默认值的列中插入null时,MySQL 5.6+就会出现这个错误。 然而,在我的例子中,我选择了一个日期,使其不为空,并且仍然得到相同的错误 my new.erb:
<%= form_for @post, :url => {:action => :create} do |f| %>
<table>
<tr>
<th>DATE</th>
<th>CONTENT</th>
</tr>
<tr>
<td><%= f.date_field :date %></td>
<td><%= f.text_field :content %></td>
</tr>
</table>
<%= f.submit %>
<% end %>
我能做些什么来解决这个问题?如有任何建议,将不胜感激。谢谢。这是由MySQL模式下的
STRICT\u TRANS\u表造成的。发件人:
严格模式控制MySQL如何处理中的无效或缺失值
数据更改语句,如INSERT或UPDATE。值可以是
由于几个原因无效。例如,它可能有错误的数据
为列键入,或者该列可能超出范围。缺少一个值
当要插入的新行不包含非空值时
在其定义中没有显式默认子句的列。(为了
NULL列,如果缺少值,则插入NULL。)严格模式
还影响DDL语句,如CREATETABLE
如果严格模式无效,MySQL将为
无效或缺少值并产生警告(请参见第节
13.7.5.40,“显示警告语法”)。在严格模式下,可以使用INSERT IGNORE或UPDATE IGNORE生成此行为
对于SELECT等不更改数据的语句,无效值
在严格模式下生成警告,而不是错误
要检查是否启用了STRICT\u TRANS\u TABLES
模式,请运行以下查询:
SHOW VARIABLES LIKE 'sql_mode';
要禁用严格模式,请在建立数据库连接(在应用程序代码中)后调用以下查询:
或
GLOBAL
关键字需要超级用户权限,它将确保更改应用于连接到服务器的所有客户端。但是,请注意,SET GLOBAL
方法不会使更改永久化。只有在MySQL服务器没有重新启动之前,它才会工作。要使更改永久化,您必须在mysqldconfig文件中进行更改。在较旧的MySQL版本中,在Linux服务器(例如:Ubuntu)中,有一个配置文件/etc/MySQL/MySQL.cnf
,您可以在[mysqld]
小节下面添加这些更改
在较新的版本中,例如在Ubuntu服务器中,文件将是:/etc/mysql/mysql.conf.d/mysqld.cnf
不过,您确实应该为表列设置默认值。对于这些日期字段,您可以将默认值设置为null
:
CREATE TABLE `posts` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NUL,
`date` date DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
SHOW VARIABLES LIKE 'sql_mode';
SET GLOBAL sql_mode='';
SET sql_mode='';
CREATE TABLE `posts` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NUL,
`date` date DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;