การตั้งค่า global sql_mode ใน mysql


94

ฉันพยายามตั้งค่า sql_mode ใน mysql แต่เกิดข้อผิดพลาด

คำสั่ง:

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

นี่ไม่ใช่วิธีที่เหมาะสมในการตั้งค่าหลายโหมดหรือไม่? ข้อดีของการตั้งค่าเซสชันและโหมดส่วนกลางคืออะไร? preffered ไหน ฉันมีผู้ใช้ที่แตกต่างกันพยายามอัปเดตฐานข้อมูลด้วยค่า UNC ที่แตกต่างกันและกำหนดให้ od ตั้งค่าโหมดเซสชันเป็น 'NO_BACKSLASH_ESCAPES' แม้ว่ามันจะสมเหตุสมผลที่จะใช้โหมด gloabl สำหรับสิ่งนี้ สิ่งนี้สมเหตุสมผลไหม

กรุณาแจ้งให้เราทราบ

ขอบคุณ.


คำพูดที่หลงผิดเหล่านั้นทำให้ฉันรำคาญมากพี. อย่างที่คนอื่นบอกฉันแน่ใจว่านี่ไม่ถูกต้องเพียงเพราะอย่างนั้น
dyasta

คำตอบ:


211

BTW หากคุณตั้งค่า globals ใน 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
Richard

2
5.7 รุ่นโปรดทราบ! นั่นคือปัญหา
Ernestas Stankevičius

ในเว็บแอปพลิเคชันจริงแบบสอบถามที่สองทำงาน ฉันเพิ่งเพิ่มแบบสอบถามอื่นหลังจากแบบสอบถามการเชื่อมต่อ mysqli ตั้งค่า SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; ขอบคุณชาด!
GTodorov

1
ใน5.7.20และสำหรับกรณีของการ mysql.iniใช้เครื่องหมายขีดล่างและการลืมเครื่องหมายคำพูดก็ใช้ได้ดีเช่นนี้:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

32

ฉันแก้ไขมันแล้ว

โหมดที่ถูกต้องคือ:

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

17
คำเตือน: จากประสบการณ์ของเราสิ่งนี้จะไม่คงการตั้งค่าไว้หลังจากที่ MySQL รีสตาร์ท ...
Chadwick Meyer

1
ใช่สิ่งนี้จะไม่คงการตั้งค่าไว้หลังจากรีสตาร์ท
prakashpoudel

4
สำหรับการรักษามันไว้หลังจากรีสตาร์ทสำหรับ unix ฉันต้องสร้างไฟล์ ~ / .my.cnf และเพิ่ม [mysqld] sql_mode = "<new mode>" หวังว่านี่จะช่วยได้
Raman Singh

28

การตั้งค่าโหมด sql อย่างถาวรโดยใช้ไฟล์ config 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และคุณควรได้รับโหมดที่คุณเพิ่งตั้งค่าไว้


15

คัดลอกไปยังไฟล์กำหนดค่า: /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
Raman Sahasi

14

สำหรับคนที่ googling ข้อผิดพลาดนี้สำหรับ MySQL 8

MySQL 8.0.11 ลบ 'NO_AUTO_CREATE_USER' ออกจาก sql-mode

MySQL 5.7: การใช้ GRANT เพื่อสร้างผู้ใช้ ให้ใช้ CREATE USER แทน การปฏิบัติตามแนวปฏิบัตินี้ทำให้โหมด NO_AUTO_CREATE_USER SQL ไม่เป็นวัสดุสำหรับคำสั่ง GRANT ดังนั้นจึงเลิกใช้งานเช่นกัน MySQL 8.0.11: การใช้ GRANT เพื่อสร้างผู้ใช้ ให้ใช้ CREATE USER แทน การปฏิบัติตามแนวปฏิบัตินี้ทำให้โหมด NO_AUTO_CREATE_USER SQL ไม่เป็นวัสดุสำหรับคำสั่ง 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}

4

สำหรับการเปลี่ยนแปลงชั่วคราวให้ใช้คำสั่งต่อไปนี้

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

สำหรับการเปลี่ยนแปลงถาวร: ไปที่ไฟล์ config /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"

3

เข้าถึงฐานข้อมูลในฐานะผู้ใช้ผู้ดูแลระบบ (อาจจะรูท)

ตรวจสอบ 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/ เนื่องจากในไฟล์ config หลัก/etc/mysql/my.cnf คำสั่งถูกเขียนขึ้นเพื่อรวมไฟล์การตั้งค่าทั้งหมดจากโฟลเดอร์/ etc / mysql / conf d /


2

ตรวจสอบเอกสารของ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

ในกรณีของฉันฉันต้องเปลี่ยนไฟล์/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ในไฟล์ config แล้วเรียกใช้งานที่SET GLOBAL sql_mode = '';นั่น


1

ในกรณีของฉัน mysql และ ubuntu 18.04.1

ฉันตั้งค่าถาวรโดยใช้คำสั่งนี้

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.