更新1/18/15
在我们最近更新到MySQL 5.6.27 (来自Ubuntu )之后,这个选项现在起作用了。因此,这似乎是以前版本的MySQL的一个问题。
原始问题
通过对MySQL的新升级(5.6.20),除非我将sql-模式设置为NO_ENGINE_SUBSTITUTION,否则更新和插入将失败。
多亏了文档,我可以在mysql终端上运行以下代码,从而解决了这个问题(暂时):
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';`但是,下次MySQL重新启动时,这些设置将丢失。
因此,我试图通过编辑/etc/mysql/my.cnf (在运行Ubuntu12.04.5LTS的标准服务器上)并添加文档应该添加的配置设置来使其永久化:
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"用于测试的替代语法
仅出于测试目的,我还尝试了以下格式(这些格式在重新启动MySQL时不会导致错误,但不会影响设置)。
# dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
# underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
# underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"毫无办法。重新启动后,此设置丢失,我必须再次从mysql终端手动运行命令,以使保存再次工作。
替代地点
通过从命令行运行以下命令,我获得了正在引用的配置文件的列表:
mysqld --help --verbose我看到一句话:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 这是它“查找”文件的默认位置,这并不意味着它实际上在那里找到了一个文件,例如,我的服务器没有/etc/my.cnf、/usr/etc/my.cnf或~/.my.cnf。
因此,看起来我在/etc/ mysql /my.cnf中的配置是mysql所引用的唯一文件,因此该设置不会被覆盖。
逻辑检验结论
从逻辑上讲,语法似乎不正确,或者因为其他原因而被忽略。还有其他想法吗?
发布于 2015-11-02 10:50:49
为了将我的配置添加到混合中,我使用的是MySQL 5.7.8,默认情况下它具有相同的严格sql_mode规则。
也就是说,破折号,而不是下划线和引号周围的价值。
这似乎对我有用。
发布于 2015-03-04 08:26:03
您的服务器可能读取不同于您正在编辑的my.cnf (除非您在启动mysqld时指定它)。
来自MySQL认证研究指南
搜索顺序包括两个通用选项文件,
/etc/my.cnf和$MYSQL_HOME/my.cnf。只有在设置了MYSQL_HOME环境变量时才使用第二个文件。通常,将其设置为MySQL安装目录。(如果在启动服务器之前没有设置mysqld_safe脚本,则该脚本将尝试设置MYSQL_HOME。)选项文件搜索顺序还包括~/.my.cnf(即主目录)。对于服务器选项来说,这不是一个特别合适的位置。(通常,您以mysql或root的形式调用服务器,并使用--user=mysql选项。服务器读取的特定于用户的文件将取决于您从哪个登录帐户调用它,可能导致使用的选项集不一致。)
当然,另一种可能性是,您的sql-mode选项会在同一个文件中被进一步覆盖。多个选项必须在同一行中用,分隔。
P.S.:你需要引号,IIRC。既然您已经尝试过没有引号,我敢肯定,您正在编辑错误的文件,因为MySQL不会在选项文件中出现错误时启动。
再看一遍我的配置文件,它是
[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"而且起作用了。
发布于 2015-03-04 08:26:10
它应该是:
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES而不是
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"然后重新启动mysqld服务。
https://stackoverflow.com/questions/28849293
复制相似问题