Как отключить STRICT_TRANS_TABLES для сервера MySQL, установленного на домашнем компьютере? - программирование

Как отключить STRICT_TRANS_TABLES для сервера MySQL, установленного на домашнем компьютере?

Кажется, что 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)

Argh!

4b9b3361

Ответ 1

Ответ

@ssnobody заставил меня искать всю мою систему для файлов my.cnf. Я уже проверил места, указанные в mysqld --help --verbose. Оказывается, мой сервер использует /usr/local/Cellar/mysql/5.6.15/my.cnf, который я ошибочно считал образцом. Файл не привязан к символам из любого стандартного местоположения, включая /usr/local/mysql.

Может ли кто-нибудь пролить свет на это? Это вещь для доморощенного? Как я мог это понять, кроме как путем внесения тестовых изменений в каждый my.cnf, который мог найти?

Ответ 2

В Centos 6.5 мне пришлось отредактировать /usr/my.cnf и установить (хотя /etc/my.cnf существует и привязки успешно установлены там

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

Ответ 3

Пожалуйста, проверьте /usr/local/mysql/my.cnf и закомментируйте проблемную настройку.

Источник: Строгий режим MySQL OS X

Ответ 4

Чтобы просто отключить STRICT_TRANS_TABLES для определенного script,

set session sql_mode = '';

когда вы инициализируете свой дескриптор db в script. Это также отключит NO_ENGINE_SUBSTITUTION, поэтому просто

set session sql_mode = 'NO_ENGINE_SUBSTITUTION';

оставит это неповрежденным.

Ответ 5

Вам нужно отредактировать:

/usr/my.cnf 

и установите

sql_mode=NO_ENGINE_SUBSTITUTION