วิธีแก้ MySQL 5.7 Group by ไม่ได้ ONLY_FULL_GROUP_BY

วิธีการแก้ไขเมื่ออัพเดท MySQL 5.7 แล้ว GROUP BY ไม่ได้ มี Error เกี่ยวกับ ONLY_FULL_GROUP_BY เราสามารถแก้ไขได้โดยการปิดโหลดนี้ใน MySQL ทำได้สองวิธีดังนี้

เอาอีกแล้วว เจอปัญหาจนได้หลังจากที่ทำการอัพเกรด MySQL จากเวอร์ชัน 5.6 ไปเป็นเวอร์ชัน 5.7 วันนี้ผมเข้าไปที่หน้าเว็บปรากฏว่ามี Error ONLY_FULL_GROUP_BY หน้าเว็บกลายเป็นหน้าเปล่าๆซะงั้น ตอนแรกก็นึกว่าเป็นที่ Driver ของเฟรมเวิร์คที่เราก็เพิ่งจะอัพเกรดไปเหมือนกัน แต่ไล่ไปไล่มาปรากฏว่าไม่ใช่ ก็เลยลองเอาคำสั่งที่เราใช้ติดต่อกับฐานข้อมูลไปลองรันดู เพราะสงสัยว่าจะเกิดจากการติดต่อหรือ Query MySQL ไม่ได้หรือเปล่า?

ผลก็ปรากฏว่าคำสั่ง MySQL ของเรานั้นมีปัญหาจริงๆด้วย Synctax ก็ไม่ได้ผิด และมี Error message ตอบกลับมาว่า

this is incompatible with sql_mode=only_full_group_by

จาก Error Message ที่เราเห็นนั่นทำให้เรารู้ว่ามีการเปิดโหมดนี้ เอาไว้ ทำให้ไม่สามารถใช้ Full Group by ได้

วิธีที่ 1 : Remove ONLY_FULL_GROUP_BY โดยใช้ MySQL console

วิธีการก็คือเข้าหลังบ้าน แล้วก็รัน mysql console ขึ้นมา สำหรับผู้ดูแลเซิร์ฟเวอร์น่าจะรู้จักดีว่าเปิด mysql console ขึ้นมาทำยังไง

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

วิธีที่ 2 : Remove โดยใช้ phpmyadmin

  • ไปที่ phpmyadmin เลือก localhost
  • จากนั้นไปที่แท็บ Variable และเลื่อนลงไปด้านล่าง มองหาชื่อ sql mode
  • ทำการลบ ONLY_FULL_GROUP_BY ออก (เอาเครื่องหมาย , ออกด้วยเด้อ) จากนั้นก็กดบันทึก
Remove ONLY_FULL_GROUP_BY by phpmyadmin
Remove by phpmyadmin

ขอขอบคุณสำหรับคำแนะนำวิธีแก้ปัญหาจากเพื่อนๆใน StackOverflow เพื่อนๆสามารถดูวิธีการ Disable only full group by เพิ่มเติมได้ที่ลิงก์นี้ได้เลยครับ https://stackoverflow.com/questions/23921117/disable-only-full-group-by

เกิดอะไรขึ้นทำไมถึง Error

เนื่องจาก MySQL 5.7.5 เปลี่ยนค่า Default เป็น Enable mode นี้เอาไว้ เวอร์ชันก่อนๆจะไม่มีปัญหา เพราะค่าตั้งต้นไม่ได้ Enable เพื่อนๆสามารถอ่านรายละเอียดของการเปลี่ยนแปลงนี้ได้จากหน้า MySQL Handling of GROUP BY ซึ่งเป็นหน้า Document ที่เขียนอธิบายเอาไว้ค่อนข้างดีและชัดเจน

MySQL Handling of GROUP BY
MySQL Handling of GROUP BY

แก้ไขไม่เป็น หรือ ทำไม่ได้ ทำไงดี ?

อันดับแรกให้ลองติดต่อผู้ดูแลเซิร์ฟเวอร์ของเราดูครับ เพราะบางที่เราไม่สามารถเข้าถึงสิทธิ์ของฐานข้อมูลระดับสูงได้ ลองแก้ตามวิธีที่ผมแนะนำแล้วก็ติด Permission จะลองรันด้วย MySQL Console ก็ไม่สามารถรันได้ อันนี้ต้องติดต่อผู้ดูแลอย่างเดียวเลยครับ แต่ถ้ายังไม่ได้ลองแล้วไม่กล้าลอง เพราะทำไม่เป็น กลัวว่าเมื่อทำไปแล้วจะเกิดปัญหา อยากจะหาคนมาช่วยแก้ไข อันนี้เพื่อนๆสามารถแสดงความคิดเห็นไว้ที่กล่องคอมเม้นด้านล่าง และฝากอีเมลเอาไว้ได้เลย หลังจากที่เรากดคอมเม้นแล้ว ระบบจะแจ้งเตือนผมทางอีเมล เดี๋ยวผมจะติดต่อกลับไปทำการช่วยเหลือแบบฟรีๆ ไม่คิดค่าใช้จ่ายใดๆทั้งสิ้นครับผม

Down Grade กลับไปใช้เวอร์ชันเดิมเลยดีไหม?

ผมว่าไม่แนะนำดีกว่าครับ เพราะปัญหานี้มันเป็นเรื่องเล็กน้อยมาก แค่ค่าเริ่มต้นที่เขาเซ็ตมามันเป็นอีกค่าหนึ่ง ซึ่งเราสามารถแก้ไขได้ ถ้าทำการ Down Grade กลับไปใช้เวอร์ชันเดิมยิ่งจะมีปัญหามากกว่านี้อีก ไหนจะเรื่องความปลอดภัย ไหนจะเรื่องของข้อมูลที่อัพเกรดมาเป็นเวอร์ชันใหม่แล้ว ถ้าทำการ Down Grade กลับไปนั้นมีปัญหามากกว่านี้แน่นอน

สรุปที่มาของปัญหาและวิธีการแก้ไข

ปัญหานี้เกิดขึ้นหลังจากที่ทางเราแจ้งให้ทีมซับพอร์ตของเซิร์ฟเวอร์ทำการอัพเกรด MySQL จากเวอร์ชัน 5.6 ไปเป็น 5.7 ซึ่งสาเหตุที่เราทำการอัพเกรดก็เนื่องจากว่า เมื่อเราทำการตรวจสอบ Site Health ใน WordPress จะมีแจ้งเตือนให้อัพเกรดเพื่อความปลอดภัยของฐานข้อมูลและเพิ่มประสิทธิภาพการทำงานของฐานข้อมูลของเรา
และจุดที่เราเจอปัญหาก็คือเจอที่หน้าแรกของภาษาอีสานในเว็บไซต์อีสานร้อยแปด ตอนที่ผมเปิดเข้าไปแล้วเจอว่าเป็นหน้าเปล่าๆ คิดในใจว่าเอาแล้วตรู เกิดจากสาเหตุอะไรเนี๊ยะ เมื่อไล่เช็คโค้ดไปไล่โค้ดมาก็ไปเจอว่าในโมเดลที่ทำการเชื่อมต่อกับฐานข้อมูลของหน้านี้ มีการใช้คำสั่ง Group By ตอนแรกก็ไม่ได้เอะใจอะไร นึกว่าเป็นที่สาเหตุอื่นด้วยซ้ำ น่าจะเป็นที่ความบังเอิญด้วยแหละ ผมก็เลยลองเอา SQL Query Message ไปลองรันดูใน PHPMyAdmin ปรากฏว่าแจ้งเตือน this is incompatible with sql_mode=only_full_group_by อย่างที่ได้เกรื่นไปในตอนแรกนั่นแหละ
ก็เลยถึงบางอ้อว่าเกิดจากที่เราอัพเกรดฐานข้อมูลแล้วไปเปิดโหมด on_full_group_by เอาไว้
เลยเป็นที่มาที่ไปของบทความวิธีแก้ปัญหานี้ ถ้าหากเพื่อนๆเห็นว่าบทความนี้มีประโยชน์ หรือ มันสามารถช่วยท่านแก้ปัญหาได้ อย่าลืมให้กำลังใจได้ง่ายๆ โดยการกดปุ่มแชร์ไปที่โซเชียลเน็ตเวิร์ค เพื่อให้เพื่อนๆของเราได้อ่านบทความดีๆร่วมกัน