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!
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?
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
Veuillez vérifier /usr/local/mysql/my.cnf
et commenter le paramètre problématique.
Source: Mode strict MySQL sous OS X
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.
Vous devez éditer:
/usr/my.cnf
et mettre
sql_mode=NO_ENGINE_SUBSTITUTION