web-dev-qa-db-fra.com

Comment désactiver STRICT_TRANS_TABLES pour un serveur MySQL installé par Homebrew?

Il semble que MySQL (5.6?) A récemment modifié le mode SQL par défaut pour le rendre plus restrictif. Le nouveau mode est "STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION". J'aime le changement, mais au moins un site Web que je gère ne l'a pas. Les requêtes INSERT échouent car elles ne spécifient pas de valeurs pour les colonnes sans valeurs par défaut. Auparavant, MySQL déduisait les valeurs par défaut par type de colonne.

Pour l'instant, je veux désactiver STRICT_TRANS_TABLES. J'ai ajouté sql_mode=NO_ENGINE_SUBSTITUTION à my.cnf et redémarré le serveur, mais le paramètre strict persiste. Qu'est-ce que je fais mal?

Version de MySQL:

$ mysqld --version
mysqld  Ver 5.6.15 for osx10.9 on x86_64 (Homebrew)

mon.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

Confirmez que mysqld utiliserait les paramètres de my.cnf:

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

Confirmez que mysqld n'est pas en cours d'exécution:

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

Liste des biens fournie par 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>

Démarrez MySQL et vérifiez le mode 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)

Argh!

13
Metaphile

La réponse de @ ssnobody m'a incité à rechercher dans mon système complet les fichiers my.cnf. J'avais déjà vérifié les emplacements listés par mysqld --help --verbose. Il se trouve que mon serveur utilise /usr/local/Cellar/mysql/5.6.15/my.cnf, que j'avais supposé à tort comme un exemple de fichier. Le fichier n’est lié par aucun lien symbolique à partir des emplacements standard, y compris /usr/local/mysql.

Quelqu'un peut-il nous éclairer? Est-ce un truc Homebrew? Comment aurais-je pu comprendre cela en apportant des modifications de test à tous les my.cnf que je pouvais trouver?

7
Metaphile

Sur Centos 6.5, j’ai dû éditer /usr/my.cnf Et le définir (même si /etc/my.cnf existait et que les liaisons y étaient définies

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION
19
vd1008

Veuillez vérifier /usr/local/mysql/my.cnf et commenter le paramètre problématique.

Source: Mode strict MySQL sous OS X

1
ssnobody

Pour simplement désactiver le STRICT_TRANS_TABLES pour un script spécifique, 

set session sql_mode = '';

lorsque vous initialisez votre descripteur de base de données dans votre script. Cela désactivera également NO_ENGINE_SUBSTITUTION, donc juste

set session sql_mode = 'NO_ENGINE_SUBSTITUTION';

laissera cela intact.

1
Will

Vous devez éditer: 

/usr/my.cnf 

et mettre 

sql_mode=NO_ENGINE_SUBSTITUTION
1
Yan Ouellet