Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 不为null,但仍获取“0”;字段';日期';不';“没有默认值”;_Mysql_Ruby On Rails - Fatal编程技术网

Mysql 不为null,但仍获取“0”;字段';日期';不';“没有默认值”;

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| %> <

我在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| %>
  <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;