在我们最近更新到MySQL 5.6.27(来自Ubuntu repo)之后,此选项现在可用.所以这似乎是以前版本的MySQL的一个问题.
随着对MySQL(5.6.20)的新升级,除非我将sql-mode设置为NO_ENGINE_SUBSTITUTION,否则更新和插入将失败.
感谢文档,我可以从mysql终端运行以下内容并解决问题(暂时):
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';`
Run Code Online (Sandbox Code Playgroud)
但是下次MySQL重启时,这些设置会丢失.
所以我试图通过编辑/etc/mysql/my.cnf(在我运行Ubuntu 12.04.5 LTS的标准服务器上)来创建永久物,然后添加文档中应该添加的配置设置:
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
仅出于测试目的,我还尝试了以下格式(重启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"
Run Code Online (Sandbox Code Playgroud)
什么都行不通.重启后,此设置丢失,我必须再次从mysql终端手动运行命令,以便再次保存.
我通过命令行运行它来获取正在引用的配置文件列表:
mysqld --help --verbose
Run Code Online (Sandbox Code Playgroud)
我看到一行内容如下:
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
Run Code Online (Sandbox Code Playgroud)
这是它"查找"文件的默认位置,它并不意味着它实际上在那里找到了一个文件,例如我的服务器没有/etc/my.cnf,/usr/etc/my.cnf或者~/.my.cnf.
所以看起来我的/etc/mysql/my.cnf中的配置是mysql引用的唯一文件,因此不会覆盖此设置.
从逻辑上讲,似乎语法不正确或因某些其他原因而被忽略.还有其他想法吗?
Mik*_*ote 36
只是为了添加我的配置,我正在使用MySQL 5.7.8,它默认具有相同的严格sql_mode规则.
我终于在/etc/mysql/my.conf中找到了以下工作:
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)即破折号,而不是下划线和价值周围的报价.
除了/etc/mysql/my.conf之外,我没有其他my.conf文件
有一些额外的配置包括从/etc/mysql/conf.d/加载,但它们是空白的.
这似乎对我有用.
您的服务器可能会读取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选项会在同一文件中被进一步覆盖.多个选项必须, 在同一行中分隔.
PS:你需要报价,IIRC.现在您已经尝试过没有引号,我很确定,您正在编辑错误的文件,因为当选项文件中出现错误时MySQL无法启动.
PPS:再次查看我的配置文件,就是这样
[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
它正在发挥作用.
它应该是:
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Run Code Online (Sandbox Code Playgroud)
代替
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
然后重启mysqld服务.
小智 5
在Ubuntu 16.04上对我来说还不错。路径:/etc/mysql/mysql.cnf
并粘贴
[mysqld]
#
# * Basic Settings
#
sql_mode = "NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
小智 5
对我来说,这是一个许可问题。
进入:
mysqld --verbose --help | grep -A 1 "Default options"
Run Code Online (Sandbox Code Playgroud)
[警告] 世界可写的配置文件 '/etc/mysql/my.cnf' 被忽略。
于是尝试执行以下,然后重启服务器
chmod 644 '/etc/mysql/my.cnf'
Run Code Online (Sandbox Code Playgroud)
它将授予 mysql 读取和写入文件的权限。
我的问题是 5.7.20 上的选项之间有空格。删除它们,使线路看起来像
[mysqld]
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)