встановлення глобального sql_mode в mysql


91

Я намагаюся встановити sql_mode в mysql, але він видає помилку.

Команда:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

Хіба це не правильний спосіб встановити кілька режимів? Які переваги встановлення сесійного та глобального режимів? який бажаний? У мене є різні користувачі, які намагаються оновити базу даних з різними значеннями UNC і прагнуть встановити режим сеансу на "NO_BACKSLASH_ESCAPES", хоча для цього було б сенсом встановити глобальний режим. Це має сенс?

Будь ласка, дай мені знати.

Дякую.


Ці помилкові цитати мене справді турбують; с. Як казали інші, я впевнений, це точно не правильно лише через це.
дьяста

Відповіді:


205

До речі, якщо ви встановите глобальні параметри в 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 для вашої версії, щоб побачити параметри режиму sql .


2
Дякую, установка в my.cnf зробила для мене трюк. Для зацікавлених ця сторінка розповість вам, які стандартні sql_modes є у версії 5.7 і вище: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Річард

2
Примітка до версії 5.7! У цьому була проблема.
Ернестас Станкевичюс,

У фактичній веб-програмі працює другий запит. Я просто додав ще один запит після запиту підключення mysqli. ВСТАНОВИТИ СЕСІЮ sql_mode = 'NO_ENGINE_SUBSTITUTION'; Спасибі Чад!
Г.Т.Тодоров

1
В 5.7.20, і для випадку mysql.ini, використовуючи підкреслення і забуває лапки працює просто відмінно, ось так:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

Я це вирішив.

правильний режим:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

17
ПОПЕРЕДЖЕННЯ: З нашого досвіду це не зберігає налаштування після перезапуску MySQL ...
Чадвік Мейер,

1
Так, це не зберігає налаштувань після перезапуску
prakashpoudel

4
Щоб зберегти його після перезапуску для unix, мені довелося створити файл ~ / .my.cnf і додати [mysqld] sql_mode = "<новий режим>". Сподіваюся, це допомагає
Раман Сінгх

27

Постійне встановлення режиму 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 і ви повинні отримати режими, які ви щойно встановили.


14

Копіювати у файл конфігурації: /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 перезапустити.


2
Я думаю, що це sql_modeзамість sql-mode.
Раман Сахасі,

13

Для тих, хто шукає цю помилку в 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}

3

Для тимчасової зміни використовуйте наступну команду

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

Для постійних змін: перейдіть до конфігураційного файлу /etc/my.cnf або /etc/mysql/mysql.conf.d/mysqld.cnf та додайте наступні рядки, після чого перезапустіть службу mysql

[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"

2

Отримати доступ до бази даних як адміністратор (можливо, root).

Перевірте поточний SQL_mode

mysql> SELECT @@sql_mode;

Щоб встановити новий режим sql_mode, закрийте базу даних, створіть файл

nano /etc/mysql/conf.d/<filename>.cnf 

з вашим вмістом sql_mode

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Перезапустіть Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start

Ми створюємо файл у папці /etc/mysql/conf.d/, оскільки в головному конфігураційному файлі /etc/mysql/my.cnf написана команда для включення всіх файлів налаштувань із папки / etc / mysql / conf. г /


1

У моєму випадку я повинен змінити файл, /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"

1

Я просто мав подібну проблему, коли MySQL (5.6.45) не приймав sql_modeжодного конфігураційного файлу.

Рішенням було додати init_file = /etc/mysql/mysql-init.sqlдо конфігураційного файлу, а потім виконати SET GLOBAL sql_mode = '';там.


1

Перевірте документацію sql_mode

Спосіб 1:

Перевірте значення за замовчуванням sql_mode:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Спосіб 2:

Доступ до phpmyadmin для редагування вашого sql_mode

  • Увійдіть на phpmyadmin і відкрийте localhost
  • Зверху на Змінні, наявні вгорі в пунктах меню, та шукайте режим sql
  • Натисніть кнопку редагувати, щоб змінити sql_mode відповідно до ваших вимог
  • Збережіть зміни

Налаштування режиму SQL в phpmyadmin

Перезапустіть сервер після виконання вищевказаних речей


1

У моєму випадку mysql та ubuntu 18.04

Я встановив його постійно, використовуючи цю команду

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Додайте рядок після конфігурації. Див. Приклад, виділений на зображенні нижче.

sql_mode = ""

Примітка: Ви також можете додати різні режими тут, це залежить від ваших потреб NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Див. Доступні посилання на режими sql та документацію

додавання режиму sql

Тоді збережіть. Після збереження вам потрібно перезапустити службу mysql, виконайте наведену нижче команду:

sudo service mysql restart

Сподіваюся, це допоможе :-)


0

Якщо хтось хоче встановити його лише для поточного сеансу, скористайтеся наступною командою

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.