Ответ 1
Я разрешил это.
правильный режим:
set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Я пытаюсь установить sql_mode в mysql, но он выдает ошибку.
Команда:
set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'
Это не правильный способ установить несколько режимов? В чем преимущества настройки сеансовых и глобальных режимов? который предлагается? У меня разные пользователи, пытающиеся обновить базу данных разными значениями UNC и установили режим сеанса в режим "NO_BACKSLASH_ESCAPES", хотя для этого было бы разумно использовать gloabl-режим. Это имеет смысл?
Пожалуйста, дайте мне знать.
Спасибо.
Я разрешил это.
правильный режим:
set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Кстати, если вы установите глобалы в MySQL:
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
Это не установит его ПОСТОЯННО, и оно будет возвращаться после каждого перезапуска.
Поэтому вы должны установить это в своем конфигурационном файле (например, /etc/mysql/my.cnf
в разделе [mysqld]), чтобы изменения оставались в силе после перезапуска MySQL:
Файл конфигурации: /etc/mysql/my.cnf
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
ОБНОВЛЕНИЕ: Более новые версии Mysql (например, 5.7.8 или выше) могут потребовать немного другого синтаксиса:
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
Убедитесь, что между sql-mode
и подчеркиванием не стоит знак подчеркивания, а режимы заключены в двойные кавычки.
Всегда обращайтесь к MySQL Docs для вашей версии, чтобы увидеть опции sql-mode.
Настройка режима sql на постоянной основе с помощью файла конфигурации mysql.
В моем случае я должен изменить файл /etc/mysql/mysql.conf.d/mysqld.cnf
, поскольку mysql.conf.d
включен в /etc/mysql/my.cnf
. Я изменяю это под [mysqld]
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
просто удалил ONLY_FULL_GROUP_BY
режим sql, потому что это вызывало проблему.
Я использую ubuntu 16.04
, php 7
и mysql --version даю мне это mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper
После этого изменения выполняются ниже команд
sudo service mysql stop
sudo service mysql start
Теперь просмотрите режимы sql по этому запросу SELECT @@sql_mode
, и вы должны получить режимы, которые вы только что установили.
Скопировать в файл конфигурации: /etc/mysql/my.cnf OR /bin/mysql/my.ini
[mysqld]
port = 3306
sql-mode=""
MySQL
перезагрузка.
Или вы также можете сделать
[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
MySQL
перезагрузка.
Для тех, кто гуглит эту ошибку для MySQL 8.
MySQL 8.0.11 удаляет "NO_AUTO_CREATE_USER" из sql-режима.
MySQL 5.7: использование GRANT для создания пользователей. Вместо этого используйте CREATE USER. Следование этой практике делает режим SQL NO_AUTO_CREATE_USER несущественным для операторов GRANT, поэтому он также не рекомендуется. MySQL 8.0.11: использование GRANT для создания пользователей. Вместо этого используйте CREATE USER. Следование этой практике делает режим SQL NO_AUTO_CREATE_USER несущественным для операторов GRANT, поэтому он также удаляется.
Взято отсюда
Итак, ваш sql_mode
может быть таким:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Или, если вы используете Docker, вы можете добавить следующую команду в docker-compose.yml
mysql:
image: mysql:8.0.13
command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
ports:
- 13306:${MYSQL_PORT}
В моем случае я должен изменить файл /etc/mysql/mysql.conf.d/mysqld.cnf
изменить это под [mysqld
]
Вставьте эту строку на части < mysqld
]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Если кто-то хочет установить его только для текущего сеанса, используйте следующую команду
set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"