ฉันเปิดใช้งานโหมด ONLY_FULL_GROUP_BY โดยไม่ตั้งใจเช่นนี้:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
ฉันจะปิดการใช้งานได้อย่างไร
column
) เพื่อติดตั้งการสืบค้นของคุณใหม่ ดูเอกสารได้ที่นี่
ฉันเปิดใช้งานโหมด ONLY_FULL_GROUP_BY โดยไม่ตั้งใจเช่นนี้:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
ฉันจะปิดการใช้งานได้อย่างไร
column
) เพื่อติดตั้งการสืบค้นของคุณใหม่ ดูเอกสารได้ที่นี่
คำตอบ:
โซลูชันที่ 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
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
MySQL จะลบเครื่องหมายจุลภาคที่ไม่ต้องการออกจากบันทึก คำตอบของ OP ถูกต้อง
GLOBAL
ไม่ได้ผลสำหรับฉัน แต่SESSION
ทำ SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
เพื่อให้การตั้งค่า 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 "ทำตามขั้นตอนเหล่านี้:
sudo nano /etc/mysql/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"
sudo service mysql restart
เพื่อเริ่ม MySQL ใหม่
สิ่งนี้จะปิดการใช้งานONLY_FULL_GROUP_BY
สำหรับผู้ใช้ทั้งหมด
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
อาจไม่อยู่ในไฟล์นี้มันอาจอยู่ในไดเรกทอรีรวม ใช้คำสั่งนี้ก่อน: grep -R "\[mysqld\]" *
เพื่อดูว่ามีอะไร - และสำหรับเรื่องนั้นให้ลองgrep -R "\bsql_mode\b" *
ใช้ความระมัดระวัง
SET sql_mode = ''
จะเป็นการล้างโหมดทั้งหมดที่เปิดใช้งานอยู่ในปัจจุบัน หากคุณไม่ต้องการยุ่งกับการตั้งค่าอื่น ๆ คุณจะต้องทำ
SELECT @@sql_mode
ก่อนอื่นเพื่อรับรายการของโหมดที่เปิดใช้งานคั่นด้วยเครื่องหมายจุลภาคแล้วตั้งเป็นรายการนี้โดยไม่มีONLY_FULL_GROUP_BY
ตัวเลือก
then SET it to this list without the ONLY_FULL_GROUP_BY option.
?
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';
sql_mode=<comma-separated-list>
แล้วหยุดและเริ่มเซิร์ฟเวอร์ของคุณ ติดตามเอกสารสำหรับระบบปฏิบัติการของคุณเพื่อหาตำแหน่งและวิธีที่ดีที่สุดในการแก้ไข my.cnf
ลองดูสิ:
SET sql_mode = ''
หมายเหตุชุมชน: ดังที่อธิบายไว้ในคำตอบด้านล่างนี้จะเป็นการล้างโหมด SQL ทั้งหมดที่เปิดใช้งานในปัจจุบัน นั่นอาจไม่จำเป็นต้องเป็นสิ่งที่คุณต้องการ
''
= 'full group by is disabled'
? MySQL ทำสิ่งที่ค่อนข้างโง่ แต่นั่นก็อยู่ที่นั่น
0 rows affected
และข้อความค้นหาของฉันยังใช้งานไม่ได้:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
global
ในคำสั่ง
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;
sql_mode
ย้อนกลับไปเป็นค่าก่อนหน้า ฉันจะทำอะไรได้บ้าง
การเพิ่มเพียงหนึ่งโหมดใน 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
ขอบคุณ @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',''))"
มันใช้ได้ดีสำหรับฉัน
SET NAMES
โดยใช้วิธีนี้ในกรณีส่วนใหญ่ไม่จำเป็นต้องมี symfony ตั้งค่าไว้แล้วผ่าน doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.htmlและทำอย่างถูกต้องผ่าน PDO dns SET NAMES เป็นวิธีการที่ล้าสมัยซึ่งไม่ควรใช้กับ PHP เวอร์ชันที่สูงกว่า 5.3
บน:
ทำ:
$ 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
/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
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
แทน
ฉันสังเกตว่าโซลูชัน @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 คุณสามารถอ่านเพิ่มเติมได้ที่นี่
ANY_VALUE()
MySQL เอกสารยังระบุวิธีการต่อไปนี้:
sql-mode="<modes>"
ในไฟล์ตัวเลือกเช่น my.cnf (ระบบปฏิบัติการ Unix) หรือ my.ini (Windows)--sql-mode="<modes>"
ตัวเลือก* อยู่ที่ไหน <modes>
รายการของโหมดที่แตกต่างกันคั่นด้วยเครื่องหมายจุลภาคอยู่ที่ไหน
หากต้องการล้างโหมด SQL อย่างชัดเจนให้ตั้งเป็นสตริงว่างโดยใช้--sql-mode=""
บนบรรทัดคำสั่งหรือsql-mode=""
ในไฟล์ตัวเลือก
ฉันเพิ่มsql-mode=""
ตัวเลือกในการ/etc/my.cnf
และใช้งานได้
โซลูชัน SO นี้อธิบายวิธีการค้นหาว่าไฟล์ my.cnf ใดที่ MySQL กำลังใช้งานอยู่
อย่าลืมรีสตาร์ท MySQL หลังจากทำการเปลี่ยนแปลง
SELECT @@GLOBAL.sql_mode;
หากคุณใช้ WAMP คลิกซ้ายที่ไอคอน WAMP จากนั้นไปที่ MySQL -> การตั้งค่า MySQL -> sql-mode แล้วเลือก sql-mode-> โหมดผู้ใช้
ใน 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 +
sql_mode := ''
เป็นไปได้ ทำไมคุณไม่เห็นด้วย?
บน 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 นี่ไง!
นี่คือสิ่งที่ฉันทำเพื่อแก้ไขใน 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'
สำหรับ 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/
หวังว่ามันจะช่วยใครซักคน!
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
''
หากคุณใช้ 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
ฉันใช้หลักคำสอนและฉันได้เพิ่ม 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 ในสิทธิ์พิเศษ
ผู้ที่ใช้งาน VPS / เซิร์ฟเวอร์ด้วยcPanel / WHMคุณสามารถทำสิ่งต่อไปนี้เพื่อปิดการใช้งาน ONLY_FULL_GROUP_BY อย่างถาวร
คุณต้องเข้าใช้งานรูท (บน VPS หรือเซิร์ฟเวอร์เฉพาะ)
ป้อน WHM ในฐานะรูทแล้วรัน phpMyAdmin
คลิกที่ตัวแปรค้นหา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
เชื่อมต่อกับเซิร์ฟเวอร์ของคุณผ่าน SFTP - SSH (root) และดาวน์โหลดไฟล์ /etc/my.cnf
เปิดด้วย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
บันทึกmy.cnf
ไฟล์และอัปโหลดกลับเข้าไปใน/etc/
ป้อน WHM แล้วไปที่ "WHM> เริ่มบริการใหม่> SQL Server (MySQL)" แล้วเริ่มบริการใหม่
ฉันทำงานกับ mysql และลงทะเบียนกับผู้ใช้รูทโซลูชั่นที่เหมาะกับฉันคือ:
mysql> SET SESSION sql_mode = (เลือกแทนที่ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));
นี่เป็นทางออกถาวรสำหรับ 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
หากคุณสามารถเข้าสู่ระบบโดยไม่มีข้อผิดพลาด - คุณควรตั้งค่าทั้งหมดทันที
คุณสามารถปิดการใช้งานได้โดยใช้ไฟล์กำหนดค่า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"
นี่คือวิธีแก้ไขการเปลี่ยนแปลงการกำหนดค่า Mysql ผ่านแดชบอร์ด phpmyadmin:
เพื่อแก้ไข "นี่ไม่เข้ากันกับ sql_mode = only_full_group_by": เปิด phpmyadmin และกลับไปที่โฮมเพจและเลือกเมนูย่อย 'ตัวแปร' เลื่อนลงเพื่อค้นหาโหมด sql แก้ไขโหมด sql และลบ 'ONLY_FULL_GROUP_BY' บันทึก
กับรุ่น 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'
SET sql_mode = ''
ไหม