ปิดใช้งานเฉพาะ ONLY_FULL_GROUP_BY


614

ฉันเปิดใช้งานโหมด ONLY_FULL_GROUP_BY โดยไม่ตั้งใจเช่นนี้:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

ฉันจะปิดการใช้งานได้อย่างไร


38
คุณเคยลองSET sql_mode = ''ไหม
Tripp Kinetics

4
เหตุใดคุณจึงต้องการปิดใช้งานโหมดที่ทำให้ MySQL ปฏิบัติตามมาตรฐาน SQL ได้ดียิ่งขึ้นและอีกวิธีหนึ่งที่สอนให้คุณระมัดระวังในการเขียนแบบสอบถามของคุณมากขึ้น?
Andriy M

34
ในฐานะของ Mysql 5.7 คุณอาจใช้ฟังก์ชัน ANY_VALUE ( column) เพื่อติดตั้งการสืบค้นของคุณใหม่ ดูเอกสารได้ที่นี่
Qoheleth-Tech

3
@AndriyM ฉันจะต้องใช้สิ่งนี้ในไม่ช้าเพราะฉันกำลังโหลดแอปพลิเคชันเก่าทั้งหมดไปยังเซิร์ฟเวอร์ใหม่และพวกเขาต้องทำงานไม่ว่าฉันจะมีแหล่งที่มาหรือไม่
Jaydee

8
@AndriyM เพราะถ้าฉันจัดกลุ่มตามคอลัมน์ดัชนีที่ไม่ซ้ำกันแล้วฉันก็รู้ว่าทุกแถวจะไม่ซ้ำกัน - เพิ่มกลุ่มแยกตามคำสั่งสำหรับทุกคน เดียว คอลัมน์. ในตารางเป็นความเจ็บปวดของราชวงศ์
Benubird

คำตอบ:


1163

โซลูชันที่ 1: ลบONLY_FULL_GROUP_BYออกจากคอนโซล mysql

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

คุณสามารถอ่านเพิ่มเติมได้ที่นี่

โซลูชันที่ 2:ลบONLY_FULL_GROUP_BYออกจาก phpmyadmin

  • เปิด phpmyadmin & เลือก localhost
  • คลิกที่เมนูตัวแปร & เลื่อนลงสำหรับโหมด sql
  • คลิกที่ปุ่มแก้ไขเพื่อเปลี่ยนค่า & ลบONLY_FULL_GROUP_BY & คลิกที่บันทึก ป้อนคำอธิบายรูปภาพที่นี่

12
โซลูชันนี้ใช้งานได้ดีกับ mySQL 5.7.11 และควรเป็นที่ยอมรับ คำตอบที่ยอมรับไม่สามารถใช้งานกับ mySQL เวอร์ชันใหม่ได้
Any_ph

4
มั่นใจเพียง มันไม่สำคัญว่าREPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')MySQL จะลบเครื่องหมายจุลภาคที่ไม่ต้องการออกจากบันทึก คำตอบของ OP ถูกต้อง
nawfal

40
ใช้งานได้ แต่เมื่อฉันรีสตาร์ทเซิร์ฟเวอร์ mysql ค่าเริ่มต้นจะถูกกู้คืน ... ทำไม? จะมีวิธีถาวรหรือไม่ ขอบคุณ!
Vincent Pazeller

52
เพื่อตอบคำถามของฉัน (วิธีแก้ไขปัญหาถาวร): คุณต้องใส่คำอธิบาย sql_mode ไว้ในไฟล์ my.cnf (เช่น /etc/my.cnf เป็นต้น) และรีสตาร์ทเซิร์ฟเวอร์ ยกตัวอย่างเช่นการแทรก (ด้านล่าง [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"
วินเซนต์ Pazeller

21
GLOBALไม่ได้ผลสำหรับฉัน แต่SESSIONทำ SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
อังเดร

371

ปรับปรุง:

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อให้การตั้งค่า mysql ปัจจุบันของคุณและปิดการใช้งานONLY_FULL_GROUP_BYผมแนะนำให้เยี่ยมชม phpmyadmin หรือไคลเอนต์ที่คุณใช้งานอยู่และพิมพ์:

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

คัดลอกผลลัพธ์ไปยังmy.iniไฟล์ของคุณ

เหรียญกษาปณ์ :sudo nano /etc/mysql/my.cnf

อูบุนตู 16 ขึ้นไป :sudo nano /etc/mysql/my.cnf

อูบุนตู 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf

ข้อควรระวัง! copy_meผลสามารถมีข้อความยาวซึ่งอาจถูกตัดโดยค่าเริ่มต้น ให้แน่ใจว่าคุณคัดลอกข้อความทั้งหมด!


คำตอบเก่า:

หากคุณต้องการปิดการใช้งานข้อผิดพลาดอย่างถาวร " Expression #N ของรายการ SELECT ไม่ได้อยู่ใน GROUP BY clause และมีคอลัมน์ที่ไม่ได้รวม 'db.table.COL' ซึ่งไม่ได้ขึ้นอยู่กับการใช้งานในคอลัมน์ใน GROUP BY clause ซึ่งไม่เข้ากันกับ sql_mode = only_full_group_by "ทำตามขั้นตอนเหล่านี้:

  1. sudo nano /etc/mysql/my.cnf
  2. เพิ่มสิ่งนี้ลงในตอนท้ายของไฟล์

    [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. sudo service mysql restart เพื่อเริ่ม MySQL ใหม่

สิ่งนี้จะปิดการใช้งานONLY_FULL_GROUP_BYสำหรับผู้ใช้ทั้งหมด


2
สำหรับฉันตั้งค่าแท็ก mysqld ในบรรทัดเดียวกันไม่ได้ทำงาน แต่จะได้ทำงานกับเส้นแบ่ง :) ขอบคุณ
bloub

23
สำหรับ Ubuntu ไฟล์ที่กำหนดค่าการปรับแต่งคือ/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
สิ่งนี้ใช้ได้กับ Ubuntu 16.04 (14 ถึง 16 อัพเกรด woes .. ) /etc/mysql/my.cnf เป็นไฟล์ที่ถูกต้อง ไฟล์ที่กล่าวถึงโดย knb รวมอยู่ในไฟล์ my.cnf นี้อย่างน้อย 16.04 (ตอนนี้การกำหนดค่าจะถูกแบ่งออกเป็นหลายไฟล์)
jwinn

2
ใช้ "SELECT @@ sql_mode;" เพื่อดูว่าโหมดใดเปิดอยู่ก่อนที่จะทำการเปลี่ยนแปลง
Zbigniew Ledwoń

1
สถานที่จริงที่คุณจะเห็น[mysqld]อาจไม่อยู่ในไฟล์นี้มันอาจอยู่ในไดเรกทอรีรวม ใช้คำสั่งนี้ก่อน: grep -R "\[mysqld\]" *เพื่อดูว่ามีอะไร - และสำหรับเรื่องนั้นให้ลองgrep -R "\bsql_mode\b" *
Oliver Williams

203

ใช้ความระมัดระวัง

SET sql_mode = '' 

จะเป็นการล้างโหมดทั้งหมดที่เปิดใช้งานอยู่ในปัจจุบัน หากคุณไม่ต้องการยุ่งกับการตั้งค่าอื่น ๆ คุณจะต้องทำ

SELECT @@sql_mode 

ก่อนอื่นเพื่อรับรายการของโหมดที่เปิดใช้งานคั่นด้วยเครื่องหมายจุลภาคแล้วตั้งเป็นรายการนี้โดยไม่มีONLY_FULL_GROUP_BYตัวเลือก


เป็นวิธีที่ดีที่สุดที่จะทำนี้then SET it to this list without the ONLY_FULL_GROUP_BY option.?
เควินเมเรดิ ธ

4
@KevinMeredith การอ่านเอกสารของฉันคือไม่มีวิธีเปิด / ปิดโหมดหนึ่งครั้ง - ตัวอย่างทั้งหมดต้องการให้คุณใส่รายการที่คั่นด้วยเครื่องหมายจุลภาค - เช่นSET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
William Turrell

1
หากนี่เป็นการเปลี่ยนแปลงถาวรให้แก้ไข my.cnf ด้วยบรรทัดดังนี้: sql_mode=<comma-separated-list>แล้วหยุดและเริ่มเซิร์ฟเวอร์ของคุณ ติดตามเอกสารสำหรับระบบปฏิบัติการของคุณเพื่อหาตำแหน่งและวิธีที่ดีที่สุดในการแก้ไข my.cnf
blackwood

107

ลองดูสิ:

SET sql_mode = ''

หมายเหตุชุมชน: ดังที่อธิบายไว้ในคำตอบด้านล่างนี้จะเป็นการล้างโหมด SQL ทั้งหมดที่เปิดใช้งานในปัจจุบัน นั่นอาจไม่จำเป็นต้องเป็นสิ่งที่คุณต้องการ


11
ว้าว''= 'full group by is disabled'? MySQL ทำสิ่งที่ค่อนข้างโง่ แต่นั่นก็อยู่ที่นั่น
Aaron Bertrand

38
ฉันคิดว่าสิ่งนี้โดยทั่วไปจะปิดใช้งานโหมด sql ใด ๆ
ZviBar

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันเห็น0 rows affectedและข้อความค้นหาของฉันยังใช้งานไม่ได้:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
ก่อนที่จะพยายามคำตอบนี้แน่นอนดูคำเตือนของ Machavityและถ้าคุณต้องการการเปลี่ยนแปลงที่จะยังคงมีอยู่ให้แน่ใจว่าจะใช้globalในคำสั่ง
thomas88wp

6
ทุกครั้งเมื่อฉันกลับมาที่ MySql หลังจากนั้นซักครู่ฉันมักจะเจอปัญหานี้ซึ่งทำให้ฉันรำคาญอยู่เสมอเพราะฉันลืมสิ่งที่เป็นปัญหาเสมอไป :) ความรู้สึกนั้นน่าผิดหวังเมื่อคุณคิดว่ามันใช้งานได้และตอนนี้มันไม่ทำงาน เนื่องจากการเปลี่ยนเวอร์ชั่น
X-HuMan

106
    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> exit;

@ RémiBreton: รุ่น mysql ของคุณคืออะไร?
WeiYuan

6
มันใช้งานได้จริง แต่หลังจากที่ฉันรีสตาร์ทระบบของฉัน (Ubuntu 16.04) การsql_modeย้อนกลับไปเป็นค่าก่อนหน้า ฉันจะทำอะไรได้บ้าง
pktangyue

ยอดเยี่ยมทำงานให้ฉันแค่ฉันต้องแปลงมันเป็นอย่างถาวร
Fernando Torres

74

การเพิ่มเพียงหนึ่งโหมดใน sql_mode โดยไม่ลบโหมดที่มีอยู่:

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

การลบโหมดเฉพาะออกจาก sql_mode โดยไม่ลบโหมดอื่น:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

ในกรณีของคุณถ้าคุณต้องการที่จะลบONLY_FULL_GROUP_BYโหมดเท่านั้นแล้วใช้คำสั่งด้านล่าง:

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

การอ้างอิง: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html


นี่เป็นคำตอบที่ยอดเยี่ยม! ขอบคุณ
WEDI

1
นี่คือทั่วโลกหรือในการเชื่อมต่อปัจจุบัน? คำตอบที่ดี!
Oliver M Grech

48

ขอบคุณ @cwhisperer ฉันมีปัญหาเดียวกันกับ Doctrine ในแอพ Symfony ฉันเพิ่งเพิ่มตัวเลือกใน config.yml ของฉัน:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

มันใช้ได้ดีสำหรับฉัน


1
และหากต้องการรวมกับ SET NAMES 'utf8' ให้ใช้งานต่อไปนี้ "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', '')); หากมีการใช้สองแบบสอบถามแทนเช่น "SET NAMES 'utf8'; SET sql_mod ... " มันจะโยน "ข้อผิดพลาดทั่วไป: 2014 ไม่สามารถดำเนินการค้นหาในขณะที่แบบสอบถามอื่น ๆ ที่ยังไม่ได้ใช้งานอยู่"
Ventzy Kunev

@VentzyKunev โปรดอย่าปฏิบัติตามคำแนะนำนี้และไม่ได้ตั้งค่าSET NAMESโดยใช้วิธีนี้ในกรณีส่วนใหญ่ไม่จำเป็นต้องมี symfony ตั้งค่าไว้แล้วผ่าน doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.htmlและทำอย่างถูกต้องผ่าน PDO dns SET NAMES เป็นวิธีการที่ล้าสมัยซึ่งไม่ควรใช้กับ PHP เวอร์ชันที่สูงกว่า 5.3
LPodolski

39

บน:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16 สำหรับ Linux (x86_64) โดยใช้ EditLine wrapper

ทำ:

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

คัดลอกและวาง:

[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

ไปที่ด้านล่างของไฟล์

$ sudo service mysql restart

mysql.cnf จะไม่ถูกเขียนทับโดยการอัพเดท mysql หรือไม่?
cwhisperer

1
@cwhisperer /etc/mysql/mysql.cnfจุดที่ 2 การตั้งค่าโฟลเดอร์+!includedir /etc/mysql/conf.d/ เดียวกันจะไปสำหรับ!includedir /etc/mysql/mysql.conf.d/ /etc/mysql/my.cnfดังนั้นฉันคิดว่าไฟล์การกำหนดค่าจะไม่ถูกเขียนทับเมื่อมีการอัพเดท คุณสามารถอ่านเพิ่มเติมได้ที่นี่http://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye

ฉันลองมันแล้วมันใช้งานไม่ได้กับ Ubuntu 18.04.2 ไบโอนิค ฉันติดตามสิ่งนี้และใช้งานได้: sitepoint.com/… - อาจเป็นเรื่องสำคัญที่จะต้องใช้รูปแบบนี้ด้วยการเว้นวรรคและเครื่องหมายคำพูด: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"อาจเป็นเรื่องสำคัญที่จะต้องสร้างไฟล์ใหม่/etc/mysql/mysql.conf.d/mysqld_mode.cnfแทน
rubo77

สิ่งนี้ใช้ได้แม้หลังจากรีสตาร์ทเซิร์ฟเวอร์ mysql
Akshay Khale

36

ฉันสังเกตว่าโซลูชัน @Eyo Okon Eyo ทำงานได้ตราบใดที่เซิร์ฟเวอร์ MySQL ไม่ได้ถูกรีสตาร์ทจากนั้นจึงรีเซ็ตการตั้งค่าเริ่มต้น นี่คือทางออกถาวรที่ทำงานสำหรับฉัน:

หากต้องการลบโหมด SQL เฉพาะ (ในกรณีนี้คือONLY_FULL_GROUP_BY ) ให้ค้นหาโหมด SQL ปัจจุบัน:

SELECT @@GLOBAL.sql_mode;

คัดลอกผลลัพธ์และลบออกจากสิ่งที่คุณไม่ต้องการ ( ONLY_FULL_GROUP_BY )

เช่น:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ถึง

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

สร้างและเปิดไฟล์นี้:

/etc/mysql/conf.d/disable_strict_mode.cnf

และเขียนและวางในโหมด SQL ใหม่ของคุณ:

[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

รีสตาร์ท MySQL:

sudo service mysql restart

หรือคุณสามารถใช้ANY_VALUE()เพื่อระงับการปฏิเสธค่า ONLY_FULL_GROUP_BY คุณสามารถอ่านเพิ่มเติมได้ที่นี่


3
ขึ้นมาANY_VALUE()
Sithu

25

MySQL เอกสารยังระบุวิธีการต่อไปนี้:

  • ชุด sql-mode="<modes>"ในไฟล์ตัวเลือกเช่น my.cnf (ระบบปฏิบัติการ Unix) หรือ my.ini (Windows)
  • ในการตั้งค่าโหมด SQL เมื่อเซิร์ฟเวอร์เริ่มทำงานผ่านบรรทัดคำสั่งให้ใช้--sql-mode="<modes>"ตัวเลือก

* อยู่ที่ไหน <modes>รายการของโหมดที่แตกต่างกันคั่นด้วยเครื่องหมายจุลภาคอยู่ที่ไหน

หากต้องการล้างโหมด SQL อย่างชัดเจนให้ตั้งเป็นสตริงว่างโดยใช้--sql-mode=""บนบรรทัดคำสั่งหรือsql-mode=""ในไฟล์ตัวเลือก

ฉันเพิ่มsql-mode=""ตัวเลือกในการ/etc/my.cnfและใช้งานได้

โซลูชัน SO นี้อธิบายวิธีการค้นหาว่าไฟล์ my.cnf ใดที่ MySQL กำลังใช้งานอยู่

อย่าลืมรีสตาร์ท MySQL หลังจากทำการเปลี่ยนแปลง


1
นี่คือคำตอบที่ถูกต้องสำหรับฉัน `Ver 14.14 Distrib 5.7.10, สำหรับ osx10.11 (x86_64)`
Sinux

ควรทำเครื่องหมายคำตอบที่ถูกต้อง คำตอบอื่น ๆ ไม่ได้ให้ทางออกที่ถาวร
sijpkes

@ br3nt ฉันจะตรวจสอบโหมดปัจจุบันที่ใช้อยู่ได้อย่างไรฉันจึงสามารถลบโหมดที่ไม่ต้องการออกได้ในกรณีที่ฉันไม่ต้องการยกเลิกการตั้งค่าโหมดทั้งหมด
simgineer

1
ลองSELECT @@GLOBAL.sql_mode;
br3nt

19

หากคุณใช้ WAMP คลิกซ้ายที่ไอคอน WAMP จากนั้นไปที่ MySQL -> การตั้งค่า MySQL -> sql-mode แล้วเลือก sql-mode-> โหมดผู้ใช้

ชำระเงินภาพนี้


มีเหตุผลที่ฉันไม่มีการตั้งค่า MySQL ในการติดตั้ง WAMP ของฉัน? มีการบริหารบริการและคอนโซล MySQL แต่ไม่มีการตั้งค่า?
Craig

นี่คือสิ่งที่ฉันกำลังมองหา! ขอบคุณที่ให้บริการ WAMP Server ที่เรียบง่าย! ฉันต้องการสิ่งนี้ในขณะที่พยายามทำการ #aggregation ในบทช่วยสอนนี้: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010

12

ใน sql ของฉัน (รุ่น 5.7.11 ที่ทำงานบน Mac OS X) สิ่งนี้ใช้ได้กับฉันในไคลเอนต์เชลล์ mysql:

SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

เอกสารอ้างอิง MySQL 5.6, sql_mode เป็นค่าเริ่มต้น

สตริงว่างใน MySQL 5.6.5 และย้อนกลับ NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES ใน 5.6.6 +

การอ้างอิง MySQL 5.6


คำตอบอื่น ๆ อ้างว่าsql_mode := ''เป็นไปได้ ทำไมคุณไม่เห็นด้วย?
Hermann Döppes

ตัวเลือกทั้งหมดในสตริงของคุณมาจากไหน อะไรคือเหตุผลเบื้องหลังสิ่งนี้
Hermann Döppes

ตาม MySQL 5.6 เอกสาร sql_mode เป็นค่าเริ่มต้นคือสตริงว่างใน MySQL 5.6.5 และ NO_ENGINE_SUBSTITUTION กลับ STRICT_TRANS_TABLES ใน 5.6.6 dev.mysql.com/doc/refman/5.6/en/...
Salvatore นาโปลี

ขอบคุณทำงานกับฉันใน Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18 สำหรับ Linux (x86_64) โดยใช้ EditLine wrapper
Paul Preibisch

12

บน MySQL 5.7 และ Ubuntu 16.04 ให้แก้ไขไฟล์ mysql.cnf

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

รวม sql_mode ดังนี้และบันทึกไฟล์

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

สังเกตว่าในกรณีของฉันฉันลบโหมด STRICT_TRANS_TABLES และ ONLY_FULL_GROUP_BY

การทำเช่นนี้มันจะบันทึกการกำหนดค่าโหมดอย่างถาวร แตกต่างกันหากคุณเพิ่งอัปเดต @@ sql_mode ผ่าน MySQL เพราะมันจะรีเซ็ตเมื่อรีสตาร์ทเครื่อง / บริการ

หลังจากนั้นเมื่อต้องการดำเนินการกำหนดค่าให้เริ่มบริการ mysql ใหม่:

$ sudo service mysql restart

ลองเข้าถึง mysql:

$ mysql -u user_name -p

หากคุณสามารถเข้าสู่ระบบและเข้าถึงคอนโซล MySQL มันก็โอเค ที่ดี!

แต่ถ้าเช่นฉันคุณต้องเผชิญกับข้อผิดพลาด"sql_mode ตัวแปรที่ไม่รู้จัก"ซึ่งบ่งชี้ว่าsql_modeเป็นตัวเลือกสำหรับmysqldคุณจะต้องกลับไปแก้ไข mysql.cnf ไฟล์อีกครั้งและเปลี่ยนไป[mysql] [mysqld]เริ่มบริการ MySQL ใหม่และทำการทดสอบครั้งสุดท้ายที่พยายามเข้าสู่ระบบบนคอนโซล MySQL นี่ไง!


1
ฉันขอแนะนำวิธีการดังกล่าวข้างต้นอย่างยิ่งกว่าการตั้งค่าในเซสชั่นขอบคุณ @ alexandre-ribeiro สำหรับผู้ที่มีอูบุนตู 16.04 และ 5.7.x MySQL, แก้ไขดีกว่าไฟล์และป้อนINIสั่งsql_mode = <โหมด>ภายใต้[mysqld]กลุ่มเช่นการประกาศกับ[MySQL]ไม่ได้ทำงานตามประสบการณ์ของผม
codarrior

ฉันมี MySQL 5.7.22 มันแปลก แต่ฉันต้องลบทั้ง STRICT_TRANS_TABLES และ ONLY_FULL_GROUP_BY ออกจากการประกาศ sql_mode ใน my.cnf ดังที่แสดงไว้ด้านบนเพื่อให้สิ่งนี้ใช้งานได้ ในความเป็นจริงฉันเพียงต้องการลบโหมด ONLY_FULL_GROUP_BY เท่านั้น หากฉัน "ตั้งค่าโกลบอล / เซสชัน sql_mode = ... " ฉันสามารถลบได้เฉพาะ ONLY_FULL_GROUP_BY โดยไม่ต้องลบ STRICT_TRANS_TABLES ออกเพื่อให้มันใช้งานได้ แต่เนื่องจากสิ่งนี้ไม่สามารถรีสตาร์ทได้เพื่อความอยู่รอดดังนั้นจึงไม่ค่อยมีประโยชน์กับฉัน
RayCh

12

นี่คือสิ่งที่ฉันทำเพื่อแก้ไขใน Mysql workbench:

ก่อนที่ฉันจะได้รับค่าปัจจุบันด้วยคำสั่งด้านล่าง

SELECT @@sql_mode 

ในภายหลังฉันลบคีย์ ONLY_FULL_GROUP_BY ออกจากรายการและฉันวางคำสั่งด้านล่าง

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

10

สำหรับ Mac OS Mojave (10.14) เทอร์มินัลเปิด

$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf

วางต่อไปนี้:

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

ปุ่มลัดเพื่อบันทึกและออกจากนาโน: Ctrl+xและyและEnter

บันทึก:คุณอาจต้องอัปเดตmysql-5.7.24-macos10.14-x86_64คำสั่งเหล่านี้เพียงตรวจสอบชื่อโฟลเดอร์ที่ถูกต้องที่คุณได้รับ/usr/local/

หวังว่ามันจะช่วยใครซักคน!


10

เพิ่มหรือลบโหมดไปที่ sql_mode

MySQL 5.7.9 หรือใหม่กว่า

ในการเพิ่มหรือลบโหมดออกsql_modeคุณสามารถใช้list_addและlist_dropฟังก์ชั่น

หากต้องการลบโหมดออกจากปัจจุบันSESSION.sql_modeคุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้:

SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');

ในการลบโหมดจากGLOBAL.sql_modeยังคงมีอยู่ว่าสำหรับปัจจุบันรันไทม์การดำเนินงานจนบริการที่จะเริ่มต้นใหม่

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');

MySQL 5.7.8 หรือก่อนหน้า

เนื่องจากsql_modeค่าเป็นสตริงของโหมด CSV คุณจะต้องตรวจสอบให้แน่ใจว่าสตริงนั้นไม่มีเครื่องหมายจุลภาคที่เหลือซึ่งสามารถทำได้โดยใช้TRIM(BOTH ',' FROM ...)ของโหมดคุณจะต้องให้แน่ใจว่าสตริงไม่ได้มีเครื่องหมายจุลภาคที่เหลือซึ่งสามารถทำได้โดยการใช้

หากต้องการลบโหมดออกจากsql_modeตัวแปรคุณจะต้องใช้REPLACE()พร้อมกับTRIM()เพื่อให้แน่ใจว่าลบเครื่องหมายจุลภาคที่เหลืออยู่ออก

SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));

ในการเพิ่มโหมดให้กับsql_modeตัวแปรคุณต้องใช้CONCAT_WS(',', ...)เพื่อให้แน่ใจว่าเครื่องหมายจุลภาคถูกผนวกเข้ากับโหมดปัจจุบันและTRIM()เพื่อให้แน่ใจว่าจะลบเครื่องหมายจุลภาคที่เหลืออยู่

SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));

หมายเหตุ: การเปลี่ยนGLOBALตัวแปรจะไม่แพร่ไปสู่SESSIONตัวแปรจนกว่าจะมีการเชื่อมต่อใหม่

GLOBALตัวแปรจะคงอยู่จนกว่าจะวิ่งให้บริการจะเริ่มต้นใหม่

SESSIONตัวแปรจะยังคงมีอยู่สำหรับการเชื่อมต่อปัจจุบันจนกว่าการเชื่อมต่อจะถูกปิดและการเชื่อมต่อใหม่ที่จะจัดตั้งขึ้น


เปลี่ยนกลับเป็น GLOBAL.sql_mode

นับตั้งแต่SET sql_mode = 'ONLY_FULL_GROUP_BY';ได้รับการดำเนินการได้โดยไม่ต้องGLOBALปรับแต่งการเปลี่ยนแปลงผลกระทบเพียงในปัจจุบันมูลค่าของรัฐซึ่งยังเกี่ยวข้องกับSESSION @@sql_modeจะลบออกไปและกลับไปใช้ทั่วโลกเริ่มต้นบนเซิร์ฟเวอร์รีสตาร์ท@@GLOBAL.sql_modeค่าที่คุณต้องการจะใช้ค่าจาก [sic]

SESSIONค่าปัจจุบันใช้ได้กับการเชื่อมต่อปัจจุบันเท่านั้น การเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้งจะเปลี่ยนค่ากลับเป็นGLOBAL ค่า

หากต้องการเปลี่ยนค่าสถานะเซสชันปัจจุบันเป็นค่าโกลบอลปัจจุบันคุณสามารถใช้หนึ่งในค่าต่อไปนี้:

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;

เปลี่ยนSESSION.sql_modeค่าเป็นONLY_FULL_GROUP_BY

SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode         | @@GLOBAL.sql_mode                            |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+

แปลงSESSION.sql_modeค่ากลับเป็นGLOBAL.sql_modeค่า

SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode                                   | @@GLOBAL.sql_mode                            |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+

เซิร์ฟเวอร์รีสตาร์ทแบบต่อเนื่อง sql_mode

ในการตั้งค่าโหมด SQL เมื่อเริ่มต้นเซิร์ฟเวอร์ให้ใช้--sql-mode="modes"ตัวเลือกในบรรทัดคำสั่งหรือsql-mode="modes"ในไฟล์ตัวเลือกเช่น my.cnf (ระบบปฏิบัติการ Unix) หรือ my.ini (Windows) [sic]

โปรดดูรุ่นของ MySQL เพื่อตรวจสอบและได้รับการสนับสนุนค่าเริ่มต้นโหมด

[mysqld]

sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4

เริ่มต้นsql_modeค่า

เนื่องจากเอกสาร MySQL ต่อค่าเวอร์ชันถูกลบฉันได้เพิ่มพวกเขาที่นี่สำหรับการอ้างอิงของคุณ

MySQL> = 8.0.11 8.0.5 - 8.0.10 ถูกข้ามไป

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.8, <= 8.0.4

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.5, <= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL> = 5.6.6, <= 5.7.4

NO_ENGINE_SUBSTITUTION

MySQL <= 5.6.5

''

8

หากคุณใช้ MySQL 8.0.11 คุณต้องลบ 'NO_AUTO_CREATE_USER' ออกจาก sql-mode

เพิ่มบรรทัดต่อไปนี้ในไฟล์/etc/mysql/my.cnfและส่วนหัว [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

จนถึงตอนนี้คำตอบนี้ใช้งานได้สำหรับ 8.0.13
tomexsans

7

ฉันใช้หลักคำสอนและฉันได้เพิ่ม driverOptions ใน doctrine.local.php ของฉัน:

return array(
'doctrine' => array(
    'connection' => array(
        'orm_default' => array(
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => array(
                'host' => 'localhost',
                'port' => '3306',
                'user' => 'myusr',
                'password' => 'mypwd',
                'dbname' => 'mydb',
                'driverOptions' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                ),
            ),
        ),
    ),
));

ใน phpmyadmin ผู้ใช้ต้องเปิดใช้งาน SUPER ในสิทธิ์พิเศษ


3
การใช้สัญลักษณ์ yaml สำหรับการกำหนดค่า Doctrine (เช่นเดียวกับใน Symfony) คุณจำเป็นต้องใช้ "1002" แทนค่าคงที่ "PDO :: MYSQL_ATTR_INIT_COMMAND" แต่ก็ยังเป็นสิ่งที่ฉันมองหาเมื่อไม่กี่สัปดาห์ที่ผ่านมา ออก. ขอบคุณสำหรับการแก้ปัญหาของคุณ! ทำงานให้ฉัน
Arvid

5

ผู้ที่ใช้งาน VPS / เซิร์ฟเวอร์ด้วยcPanel / WHMคุณสามารถทำสิ่งต่อไปนี้เพื่อปิดการใช้งาน ONLY_FULL_GROUP_BY อย่างถาวร

คุณต้องเข้าใช้งานรูท (บน VPS หรือเซิร์ฟเวอร์เฉพาะ)

  1. ป้อน WHM ในฐานะรูทแล้วรัน phpMyAdmin

  2. คลิกที่ตัวแปรค้นหาsql_modeคลิกที่ 'แก้ไข' และคัดลอกทั้งบรรทัดในกล่องข้อความนั้น

เช่นคัดลอกสิ่งนี้:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. เชื่อมต่อกับเซิร์ฟเวอร์ของคุณผ่าน SFTP - SSH (root) และดาวน์โหลดไฟล์ /etc/my.cnf

  2. เปิดด้วยmy.cnfไฟล์ตัวแก้ไขข้อความบนพีซีของคุณและวางลงใน (ใต้[mysqld]ส่วน) บรรทัดทั้งหมดที่คุณคัดลอกที่ขั้นตอน (2) แต่ลบออกONLY_FULL_GROUP_BY,

เช่นวางสิ่งนี้:

# disabling ONLY_FULL_GROUP_BY
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. บันทึกmy.cnfไฟล์และอัปโหลดกลับเข้าไปใน/etc/

  2. ป้อน WHM แล้วไปที่ "WHM> เริ่มบริการใหม่> SQL Server (MySQL)" แล้วเริ่มบริการใหม่


4

ฉันทำงานกับ mysql และลงทะเบียนกับผู้ใช้รูทโซลูชั่นที่เหมาะกับฉันคือ:

mysql> SET SESSION sql_mode = (เลือกแทนที่ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));


3

นี่เป็นทางออกถาวรสำหรับ MySql 5.7+ บน Ubuntu 14+:

$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name

หากคุณสามารถเข้าสู่ระบบโดยไม่มีข้อผิดพลาด - คุณควรตั้งค่าทั้งหมดทันที


1

คุณสามารถปิดการใช้งานได้โดยใช้ไฟล์กำหนดค่าmy.cnf:

$ mysql --verbose --help | grep my.cnf

ดังนั้นใน MacOS 10.12, usr/local/etc/my.cnfมันจะอยู่ที่ คุณสามารถแก้ไขได้sql_modeที่นี่:

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
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 ผ่านแดชบอร์ด phpmyadmin:

เพื่อแก้ไข "นี่ไม่เข้ากันกับ sql_mode = only_full_group_by": เปิด phpmyadmin และกลับไปที่โฮมเพจและเลือกเมนูย่อย 'ตัวแปร' เลื่อนลงเพื่อค้นหาโหมด sql แก้ไขโหมด sql และลบ 'ONLY_FULL_GROUP_BY' บันทึก


0

กับรุ่น MySQL 5.7.28 ตรวจสอบโดยใช้
SELECT @@sql_mode; และปรับปรุงด้วย

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