web-dev-qa-db-de.com

Wie kann ich STRICT_TRANS_TABLES für einen MySQL-Server mit Homebrew-Installation deaktivieren?

Es scheint, dass MySQL kürzlich (5.6?) Den Standard-SQL-Modus geändert hat, um restriktiver zu sein. Der neue Modus ist "STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION". Ich mag die Änderung, aber mindestens eine Website, die ich betreue, tut es nicht. INSERT-Abfragen schlagen fehl, weil sie keine Werte für Spalten ohne Standardwerte angeben. Vorher würde MySQL Standardwerte nach dem Spaltentyp ableiten.

Im Moment möchte ich STRICT_TRANS_TABLES deaktivieren. Ich habe sql_mode=NO_ENGINE_SUBSTITUTION zu my.cnf hinzugefügt und den Server neu gestartet, aber die strikte Einstellung bleibt bestehen. Was mache ich falsch?

MySQL-Version:

$ 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

Bestätigen Sie, dass mysqld Einstellungen in my.cnf verwenden würde:

$ mysqld --print-defaults
mysqld would have been started with the following arguments:
--sql_mode=NO_ENGINE_SUBSTITUTION

Stellen Sie sicher, dass mysqld derzeit nicht ausgeführt wird:

$ ps aux | grep mysql
metaphile        1022   0.0  0.0  2432784    600 s003  S+    3:10PM   0:00.00 grep mysql

Immobilienliste von 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>

Starten Sie MySQL und überprüfen Sie den SQL-Modus:

$ 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)

Argh!

13
Metaphile

Die Antwort von @ssnobody veranlasste mich, mein gesamtes System nach my.cnf-Dateien zu durchsuchen. Ich hatte bereits die Standorte anhand von mysqld --help --verbose geprüft. Es stellt sich heraus, dass mein Server /usr/local/Cellar/mysql/5.6.15/my.cnf verwendet, von dem ich zu Unrecht angenommen hatte, dass es sich um eine Beispieldatei handelt. Die Datei ist an keinem der Standardspeicherorte verlinkt, einschließlich /usr/local/mysql.

Kann jemand etwas Licht ins Dunkel bringen? Ist es eine Homebrew-Sache? Wie hätte ich das herausfinden können, außer indem ich an allen my.cnf, die ich finden konnte, Teständerungen vornimmt?

7
Metaphile

In Centos 6.5 musste ich /usr/my.cnf Bearbeiten und festlegen (obwohl /etc/my.cnf vorhanden war und Bindings dort erfolgreich gesetzt wurden

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
19
vd1008

Bitte überprüfen Sie /usr/local/mysql/my.cnf und kommentieren Sie die problematische Einstellung aus.

Quelle: MySQL Strict Mode unter OS X

1
ssnobody

Um nur STRICT_TRANS_TABLES für ein bestimmtes Skript zu deaktivieren, 

set session sql_mode = '';

wenn Sie Ihre Datenbankkennung in Ihrem Skript initialisieren. Das wird auch NO_ENGINE_SUBSTITUTION deaktivieren, also einfach

set session sql_mode = 'NO_ENGINE_SUBSTITUTION';

wird das intakt lassen.

1
Will

Sie müssen bearbeiten: 

/usr/my.cnf 

und setzen 

sql_mode=NO_ENGINE_SUBSTITUTION
1
Yan Ouellet