似乎MySQL最近(5.6?)将默认的SQL模式更改为更具限制性。新模式为“STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION”。我喜欢这个改变,但至少有一个我维护过的网站没有。 INSERT查询失败,因为它们没有为没有默认值的列指定值。之前,MySQL会按列类型推断默认值。
现在,我想禁用STRICT_TRANS_TABLES。我已将sql_mode=NO_ENGINE_SUBSTITUTION
添加到my.cnf
并重新启动服务器,但严格设置仍然存在。我做错了什么?
MySQL版本:
$ mysqld --version
mysqld Ver 5.6.15 for osx10.9 on x86_64 (Homebrew)
的my.cnf:
$ cat /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
# not sure if this is needed but it doesn't seem to have an effect either way
[mysqld_safe]
sql_mode=NO_ENGINE_SUBSTITUTION
确认mysqld将使用my.cnf中的设置:
$ mysqld --print-defaults
mysqld would have been started with the following arguments:
--sql_mode=NO_ENGINE_SUBSTITUTION
确认mysqld当前没有运行:
$ ps aux | grep mysql
metaphile 1022 0.0 0.0 2432784 600 s003 S+ 3:10PM 0:00.00 grep mysql
Homebrew提供的物业清单:
$ cat ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql/bin/mysqld_safe</string>
<string>--bind-address=127.0.0.1</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/var</string>
</dict>
</plist>
启动MySQL并检查SQL模式:
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$ mysql -uroot
...
mysql> SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode;
+--------------------------------------------+--------------------------------------------+
| @@GLOBAL.sql_mode | @@SESSION.sql_mode |
+--------------------------------------------+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+--------------------------------------------+
1 row in set (0.00 sec)
哎呀!
答案 0 :(得分:20)
在Centos 6.5上我必须编辑/usr/my.cnf
并设置(即使存在/etc/my.cnf
并且在那里成功设置了绑定
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
答案 1 :(得分:7)
@ ssnobody的回答促使我在整个系统中搜索my.cnf文件。我已经检查了mysqld --help --verbose
列出的位置。事实证明我的服务器正在使用/usr/local/Cellar/mysql/5.6.15/my.cnf
,我错误地认为它是一个示例文件。该文件未与任何标准位置进行符号链接,包括/usr/local/mysql
。
有人可以对此有所了解吗?这是Homebrew的事吗?除了通过对我能找到的每个my.cnf进行测试修改,我怎么能想到这个呢?
答案 2 :(得分:1)
请检查/usr/local/mysql/my.cnf
并注明有问题的设置。
答案 3 :(得分:1)
要为特定脚本禁用STRICT_TRANS_TABLES,
set session sql_mode = '';
在脚本中初始化db句柄时。这也将禁用NO_ENGINE_SUBSTITUTION,所以只需
set session sql_mode = 'NO_ENGINE_SUBSTITUTION';
将完整保留。
答案 4 :(得分:1)
您需要修改:
/usr/my.cnf
并设置
sql_mode=NO_ENGINE_SUBSTITUTION