Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 5.7的行为类似于5.1_Mysql_Database - Fatal编程技术网

使mysql 5.7的行为类似于5.1

使mysql 5.7的行为类似于5.1,mysql,database,Mysql,Database,我已经从运行MySQL版本5.1.73-源代码发行版的服务器迁移到运行5.7.16-0ubuntu0.16.04.1-(Ubuntu)的服务器。两台服务器仍在运行 但是,我在过去正常工作的查询中遇到了多个(令人恼火的)错误,例如: (Error #1364) Field 'Settings' doesn't have a default value 我没有在insert上编写包含设置的查询,因为它还不需要一个值,这是一种很奇特的说法 因此,我想我将进入并更改该字段,并给它一个默认值。我深情地

我已经从运行MySQL版本
5.1.73-源代码发行版
的服务器迁移到运行
5.7.16-0ubuntu0.16.04.1-(Ubuntu)
的服务器。两台服务器仍在运行

但是,我在过去正常工作的查询中遇到了多个(令人恼火的)错误,例如:

 (Error #1364) Field 'Settings' doesn't have a default value
我没有在insert上编写包含
设置的查询,因为它还不需要一个值,这是一种很奇特的说法

因此,我想我将进入并
更改该字段,并给它一个默认值。我深情地告诉我

#1101 - BLOB, TEXT, .. column 'Settings' can't have a default value
谢谢你,MySQL

所以看起来我必须重构代码,但这可能需要一些时间让新服务器上的MySQL仿效5.1.73的最简单方法是什么?


更新:似乎可以将一个长文本字段设置为NULL(而不是NULL),然后默认值实际上将为NULL。但在长文本或类似字段上,不能有默认值为“空”或“空”。我在这里学到的一课是,在没有明确引用某些字段的情况下,在数据库中创建骨架/裸记录条目时要小心;任何未引用的LONGTEXT字段都需要为空-顺便说一句,这是一个合理的逻辑值,而不是空白值。

这与他们在5.7中所做的更改有关,默认情况下强制使用严格的SQL模式。MySQL 5.7中的默认SQL模式是:
仅\u FULL\u GROUP\u BY、严格的\u TRANS\u表、无\u ENGINE\u替换

有关更多信息,请参阅

你可能会问,“为什么他们不让严格模式成为可选模式,但在默认情况下将其关闭?”答案是,他们这样做了大约10年!是时候进行下一步了,并在默认情况下实施严格模式。它有助于MySQL实现更好的SQL遵从性,并与其他标准RDBMS产品兼容

那么,如何关闭严格模式,使其像以前更宽松的SQL模式一样工作呢?很简单,把这个放在你的/etc/my.cnf中:

sql_mode=NO_ENGINE_SUBSTITUTION
您还可以在不重新启动mysqld的情况下启用该更改:

mysql> SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';

你可能想保持没有引擎替换。引擎替换意味着,例如,如果您声明了一个Engine=InnoDB的表,但InnoDB存储引擎由于某种原因未启用,MySQL将创建该表,但将以静默方式使其成为MyISAM。如果您打算将其设置为InnoDB,那么这是一件坏事。

这些字段可以为空。您从未指定尝试设置默认值的内容。你看,当你对某事大发雷霆时,至少要确定你不是错的人。我没有投你反对票,但出于某种原因,我决定写一篇可能对你有帮助的评论。这不是软件的错,是你的错。这总是你的错,如果你是一个程序员或试图成为一个程序员,那应该是你的口头禅。武士们想到死亡并试图拥抱它,你应该拥抱你几乎总是错的。不要责怪你正在使用的软件。你是对的,我提到的字段可以设置为null,它确实可以工作。但如果我想避免速度的空值,我不能这样做。供您参考,我正在为这个项目创建一个服务通知单,这样我就可以更改所有这些项目,但是很高兴能够知道如何恢复行为,然后在继续使用时进行修改。我还更新了帖子以澄清这一点。等等,什么,避免速度为空值?我很抱歉,但你不能证明你的决定是正确的,也不能说明你的表现原因。这也是完全错误的。如果你愿意为了想象中的表演而阻碍自己,那你就是在做非常非常非常错误的事情。首先修复数据模型。如果你有表现问题,当你开始感觉到的时候,把注意力集中在他们身上。如果我们说的是插入,那么有一种方法可以使用事务使插入更快。再多愚蠢地摆弄默认值也不会导致毫秒级的性能。嘿,比尔,谢谢你的输入。但是,在my.cnf中添加
sql\u mode=NO\u ENGINE\u SUBSTITUTION
会导致无法重新启动mysql。拆下线路并重新启动;推荐的
journalctl-xe
不显示有关原因的信息。类似地,调用
SET GLOBAL sql\u mode='NO\u ENGINE\u SUBSTITUTION'
对行为没有影响。我会继续查找。每当MySQL启动失败时,请检查其错误日志中是否有显示错误的行。