Vô hiệu hóa CHỈ_ULL_GROUP_BY


615

Tôi đã vô tình kích hoạt chế độ CHỈ_ULL_GROUP_BY như thế này:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Làm thế nào để tôi vô hiệu hóa nó?


39
Bạn đã thử SET sql_mode = ''chưa
Động học Tripp

4
Tại sao bạn muốn vô hiệu hóa một chế độ làm cho MySQL tuân thủ tốt hơn các tiêu chuẩn SQL và một chế độ cũng dạy bạn phải cẩn thận hơn trong việc viết các truy vấn của mình?
Andriy M

34
Thay vào đó, kể từ Mysql 5.7, bạn có thể sử dụng hàm ANY_VALUE ( column) để cải thiện truy vấn của mình. Xem tài liệu ở đây
Qoheleth-Tech

3
@AndriyM Tôi sẽ cần sử dụng sớm vì tôi đang chuyển toàn bộ tải ứng dụng cũ sang máy chủ mới và chúng cần hoạt động, cho dù tôi có nguồn hay không.
Jaydee

8
@AndriyM Bởi vì nếu tôi được nhóm theo một cột chỉ mục duy nhất, thì tôi CRENG biết rằng mỗi hàng sẽ là duy nhất - thêm một nhóm riêng biệt theo lệnh cho mỗi. Độc thân. cột. trong bàn là một nỗi đau hoàng gia.
Benubird

Câu trả lời:


1163

Giải pháp 1: Loại bỏ CHỈ_ULL_GROUP_BY khỏi bảng điều khiển mysql

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

bạn có thể đọc thêm ở đây

Giải pháp 2: Xóa CHỈ_ULL_GROUP_BY khỏi phpmyadmin

  • Mở phpmyadmin và chọn localhost
  • Nhấp vào menu Biến và cuộn xuống cho chế độ sql
  • Nhấp vào nút chỉnh sửa để thay đổi các giá trị và xóa CHỈ_ULL_GROUP_BY và nhấp vào lưu. nhập mô tả hình ảnh ở đây

12
Giải pháp này hoạt động tốt trên myQuery 5.7.11 và nên được chấp nhận. Câu trả lời được chấp nhận không hoạt động trên phiên bản mới của
myQuery

4
Chỉ cần đảm bảo. Không thành vấn đề REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), dù sao thì MySQL cũng xóa các dấu phẩy không mong muốn khỏi bản ghi. Câu trả lời của OP là chính xác.
nawfal

40
Điều này hoạt động, nhưng khi tôi khởi động lại máy chủ mysql, mặc định được khôi phục ... tại sao? Có một giải pháp bền bỉ? Cảm ơn!
Vincent Pazeller

52
Để trả lời câu hỏi của tôi (giải pháp liên tục): bạn phải đặt mô tả của sql_mode bên trong tệp my.cnf (ví dụ /etc/my.cnf) và khởi động lại máy chủ. Ví dụ, chèn (dưới [mysqld] phần) sql_mode = "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Vincent Pazeller

21
GLOBALđã không làm việc cho tôi, nhưng SESSIONđã làm. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre

371

Cập nhật:

nhập mô tả hình ảnh ở đây

Để giữ cài đặt mysql hiện tại của bạn và vô hiệu hóa, ONLY_FULL_GROUP_BYtôi khuyên bạn nên truy cập phpmyadmin hoặc bất kỳ ứng dụng khách nào bạn đang sử dụng và nhập:

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

kết quả sao chép tiếp theo vào my.initập tin của bạn .

bạc hà :sudo nano /etc/mysql/my.cnf

ubfox 16 trở lên :sudo nano /etc/mysql/my.cnf

Ubuntu 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf

Chú ý! copy_mekết quả có thể chứa một văn bản dài có thể được cắt theo mặc định. Hãy chắc chắn rằng bạn sao chép toàn bộ văn bản!


câu trả lời cũ:

Nếu bạn muốn tắt lỗi vĩnh viễn " Biểu thức #N của danh sách CHỌN không có trong mệnh đề GROUP BY và chứa cột không phân chia 'db.table.COL', không phụ thuộc chức năng vào các cột trong mệnh đề GROUP BY; điều này không tương thích với sql_mode = only_full_group_by "Thực hiện các bước đó:

  1. sudo nano /etc/mysql/my.cnf
  2. Thêm phần này vào cuối tập tin

    [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 để khởi động lại MySQL

Điều này sẽ vô hiệu hóa ONLY_FULL_GROUP_BYcho TẤT CẢ người dùng


2
đối với tôi, việc đặt thẻ mysqld trên cùng một dòng không hoạt động, nhưng đã hoạt động với ngắt dòng :) cảm ơn
bloub

23
Đối với Ubuntu, tệp có giá trị cấu hình tùy chỉnh là/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
Điều này làm việc cho Ubuntu 16.04 (14 đến 16 tai họa nâng cấp ..). /Etc/mysql/my.cnf là tệp chính xác. Tệp được đề cập bởi knb được bao gồm trong tệp my.cnf này, ít nhất là 16.04 (cấu hình hiện được chia thành nhiều tệp).
jwinn

2
Sử dụng "CHỌN @@ sql_mode;" để xem những chế độ hiện đang được bật trước khi thực hiện thay đổi.
Zbigniew Ledwoń

1
địa điểm thực tế mà bạn sẽ thấy [mysqld]có thể không có trong tệp này, nó có thể nằm trong một thư mục bao gồm. Trước tiên hãy sử dụng lệnh này: grep -R "\[mysqld\]" *để xem những gì ở đó - và cho vấn đề đó hãy thửgrep -R "\bsql_mode\b" *
Oliver Williams

203

Cẩn thận sử dụng

SET sql_mode = '' 

Điều này thực sự xóa tất cả các chế độ hiện được kích hoạt. Nếu bạn không muốn gây rối với các cài đặt khác, bạn sẽ muốn thực hiện

SELECT @@sql_mode 

đầu tiên, để có được danh sách các chế độ được phân tách bằng dấu phẩy, sau đó đặt nó vào danh sách này mà không có ONLY_FULL_GROUP_BYtùy chọn.


Cách tốt nhất để làm điều này là then SET it to this list without the ONLY_FULL_GROUP_BY option.gì?
Kevin Meredith

4
@KevinMeredith đọc sách của tôi trong những tài liệu là không có cách nào để biến một chế độ on / off tại một thời điểm - tất cả các ví dụ yêu cầu bạn phải cung cấp một danh sách bằng dấu phẩy của những người bạn muốn - ví dụ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
Nếu đây là một thay đổi vĩnh viễn, hãy chỉnh sửa my.cnf bằng một dòng như thế này:, sql_mode=<comma-separated-list>sau đó dừng và khởi động máy chủ của bạn. Thực hiện theo các tài liệu cho hệ điều hành của bạn để biết vị trí và cách tốt nhất để chỉnh sửa, my.cnf.
gỗ đen

107

Hãy thử xem:

SET sql_mode = ''

Lưu ý cộng đồng: Như đã chỉ ra trong các câu trả lời dưới đây, điều này thực sự xóa tất cả các chế độ SQL hiện được bật. Đó có thể không nhất thiết là những gì bạn muốn.


11
Ồ, ''= 'full group by is disabled'? MySQL làm một số thứ khá ngớ ngẩn nhưng cái đó ở trên đó.
Aaron Bertrand

38
Tôi nghĩ rằng điều này về cơ bản vô hiệu hóa bất kỳ chế độ sql;
ZviBar

Điều này đã không làm việc cho tôi. Tôi thấy 0 rows affectedvà truy vấn của tôi vẫn không hoạt động:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
Trước khi thử câu trả lời này, chắc chắn hãy xem cảnh báo của Machavity và nếu bạn muốn các thay đổi được duy trì, hãy đảm bảo sử dụng globaltrong lệnh .
thomas88wp

6
Mỗi lần tôi quay lại MySql sau một thời gian, tôi luôn gặp phải vấn đề này làm tôi khó chịu, vì tôi luôn quên vấn đề là gì :) Cảm giác thật đáng thất vọng, khi bạn nghĩ rằng nó đang hoạt động và bây giờ thì không vì thay đổi phiên bản.
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: phiên bản mysql của bạn là gì?
WeiYuan

6
Điều này thực sự hoạt động. Nhưng sau khi tôi khởi động lại hệ thống của mình (ubfox 16.04), việc sql_modekhôi phục lại giá trị trước đó. Tôi có thể làm gì bây giờ?
pktangyue

tuyệt vời, làm việc cho tôi, chỉ cần tôi chuyển đổi cái này vĩnh viễn
Fernando Torres

74

Chỉ thêm một chế độ vào sql_mode mà không xóa các chế độ hiện có:

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

Chỉ xóa một chế độ cụ thể khỏi sql_mode mà không xóa các chế độ khác:

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

Trong trường hợp của bạn, nếu bạn muốn xóa ONLY_FULL_GROUP_BYchế độ chỉ , sau đó sử dụng lệnh bên dưới:

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

Tham khảo: http://johnemb.blogspot.com/2014/09/adding-or-removing-inderson-sql-modes.html


Đây là một câu trả lời tuyệt vời! Cảm ơn.
wedi

1
Đây là toàn cầu hoặc trên các kết nối hiện tại? Câu trả lời chính xác!
Oliver M Grech

48

Cảm ơn @cwhisperer. Tôi gặp vấn đề tương tự với Doctrine trong ứng dụng Symfony. Tôi vừa thêm tùy chọn vào 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',''))"

Điều này làm việc tốt cho tôi.


1
Và nếu cần kết hợp với SET NAMES 'utf8', hãy sử dụng sau "SET NAMES 'utf8', sql_mode = (CHỌN REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Nếu hai truy vấn được sử dụng thay vì "SET NAMES 'utf8'; SET sql_mod ..." thì nó sẽ đưa ra "Lỗi chung: 2014 Không thể thực hiện các truy vấn trong khi các truy vấn không có bộ đệm khác đang hoạt động."
Ventzy Kunev

@VentzyKunev vui lòng không làm theo lời khuyên này và không được thiết lập SET NAMESbằng phương pháp này, trong hầu hết các trường hợp, symfony không cần thiết đã đặt nó thông qua doctrine.dbal.charset cofnig: symfony.com/doc/cản/reference/configuration/doctrine.html và thực hiện đúng cách thông qua PDO dns, SET NAMES là cách làm lỗi thời, không nên sử dụng cho phiên bản PHP lớn hơn 5,3
LPodolski

39

Trên:

  • Ubuntu 14.04
  • mysql Ver 14,14 Phân phối 5.7.16, cho Linux (x86_64) bằng cách sử dụng trình bao bọc EditLine

Làm:

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

Sao chép và dán:

[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

Đến cuối tập tin

$ sudo service mysql restart

Liệu mysql.cnf sẽ không bao giờ bị ghi đè bởi bản cập nhật mysql?
cwhisperer

1
@cwhisperer /etc/mysql/mysql.cnftrỏ đến 2 thư mục cấu hình !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. Cùng đi cho /etc/mysql/my.cnf. Do đó tôi giả sử rằng các tệp cấu hình không bị ghi đè khi cập nhật. Bạn có thể đọc thêm ở đâyhttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye 8/11/2016

Tôi đã thử điều này và nó không hoạt động trên Ubuntu 18.04.2 bionic. Tôi đã làm theo và nó đã hoạt động: sitepoint.com/, - có lẽ điều quan trọng là sử dụng định dạng này với dấu cách và dấu ngoặc kép: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"có lẽ điều quan trọng là tạo một tệp mới /etc/mysql/mysql.conf.d/mysqld_mode.cnfthay thế
rubo77

Điều này hoạt động ngay cả sau khi máy chủ mysql khởi động lại
Akshay Khale

36

Tôi đã nhận thấy rằng giải pháp @Eyo Okon Eyo hoạt động miễn là máy chủ MySQL không được khởi động lại, sau đó cài đặt mặc định được khôi phục. Đây là một giải pháp lâu dài có hiệu quả với tôi:

Để xóa chế độ SQL cụ thể (trong trường hợp này là CHỈ_ULL_GROUP_BY ), hãy tìm chế độ SQL hiện tại:

SELECT @@GLOBAL.sql_mode;

sao chép kết quả và xóa khỏi nó những gì bạn không cần ( CHỈ_ULL_GROUP_BY )

ví dụ:

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

đến

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

tạo và mở tập tin này:

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

và viết và dán vào đó chế độ SQL mới của bạn:

[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

khởi động lại MySQL:

sudo service mysql restart

Hoặc bạn có thể sử dụng ANY_VALUE()để loại bỏ từ chối giá trị CHỈ_ULL_GROUP_BY, bạn có thể đọc thêm về nó tại đây


3
Lên choANY_VALUE()
Sithu

25

Các tài liệu MySQL cũng quy định cụ thể các phương pháp sau:

  • Đặt sql-mode="<modes>"trong một tệp tùy chọn, chẳng hạn như my.cnf (hệ điều hành Unix) hoặc my.ini (Windows).
  • Để đặt chế độ SQL khi máy chủ khởi động thông qua dòng lệnh, hãy sử dụng --sql-mode="<modes>"tùy chọn.

* Trường hợp <modes>danh sách các chế độ khác nhau được phân tách bằng dấu phẩy.

Để xóa chế độ SQL một cách rõ ràng, hãy đặt nó thành một chuỗi trống bằng cách sử dụng --sql-mode=""trên dòng lệnh hoặc sql-mode=""trong một tệp tùy chọn.

Tôi đã thêm sql-mode=""tùy chọn /etc/my.cnfvà nó hoạt động.

Giải pháp SO này thảo luận về các cách để tìm ra tập tin my.cnf nào đang được sử dụng bởi MySQL.

Đừng quên khởi động lại MySQL sau khi thực hiện thay đổi.


1
đây là câu trả lời đúng cho tôi `Ver 14,14 Phân phối 5.7.10, cho osx10.11 (x86_64)`
Sinux

điều này nên được đánh dấu câu trả lời đúng. Các câu trả lời khác không cung cấp một giải pháp lâu dài.
sijpkes

@ br3nt Làm cách nào để phát hiện các chế độ hiện tại được sử dụng để tôi có thể xóa các chế độ không mong muốn trong trường hợp tôi không muốn hủy đặt tất cả các chế độ?
simgineer

1
Hãy thửSELECT @@GLOBAL.sql_mode;
br3nt

19

Nếu bạn đang sử dụng WAMP. Nhấp chuột trái vào biểu tượng WAMP, sau đó chọn MySQL -> Cài đặt MySQL -> chế độ sql và sau đó chọn sql-mode-> chế độ người dùng

Kiểm tra hình ảnh này


Có lý do nào khiến tôi không có Cài đặt MySQL trong cài đặt WAMP của mình không? Có quản trị dịch vụ và bảng điều khiển MySQL nhưng không có cài đặt?
Craig

Điều này thật đúng với gì mà tôi đã tìm kiếm! Cảm ơn đã cung cấp một giải pháp WAMP Server đơn giản! Tôi cần điều này trong khi cố gắng thực hiện #aggregation trong hướng dẫn này: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010

12

Trên sql của tôi (phiên bản 5.7.11 chạy trên Mac OS X), công việc này đối với tôi trên máy khách shell 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"

Theo Tài liệu MySQL 5.6, sql_mode được mặc định là

chuỗi trống trong MySQL 5.6.5 trở lại NO_ENGINE_SUBSTITNING, STRICT_TRANS_TABLES trong 5.6.6 +

tài liệu tham khảo mysql 5.6


Các câu trả lời khác tuyên bố sql_mode := ''là có thể. Tại sao bạn không đồng ý?
Hermann Döppes

Trường hợp tất cả các tùy chọn trong chuỗi của bạn đến từ đâu? Lý do đằng sau này là gì?
Hermann Döppes

Theo Tài liệu MySQL 5.6, sql_mode mặc định là chuỗi trống trong MySQL 5.6.5 và trở lại NO_ENGINE_SUBSTITNING, STRICT_TRANS_TABLES trong 5.6.6 dev.mysql.com/doc/refman/5.6/en/ của
Salvatore Napoli

Cảm ơn đã làm việc cho tôi trên Ubuntu 16.04 - mysql Ver 14,14 Phân phối 5.7,18, cho Linux (x86_64) bằng cách sử dụng trình bao bọc EditLine
Paul Preibisch

12

Trên MySQL 5.7 và Ubuntu 16.04, hãy chỉnh sửa tệp mysql.cnf.

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

Bao gồm sql_mode như sau và lưu tệp.

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

Quan sát rằng, trong trường hợp của tôi, tôi đã xóa chế độ STRICT_TRANS_TABLES và ONLY_FULL_GROUP_BY.

Làm điều này, nó sẽ lưu cấu hình chế độ vĩnh viễn. Khác nhau nếu bạn chỉ cập nhật @@ sql_mode thông qua MySQL, bởi vì nó sẽ thiết lập lại khi khởi động lại máy / dịch vụ.

Sau đó, để cấu hình được sửa đổi thực hiện, hãy khởi động lại dịch vụ mysql:

$ sudo service mysql restart

Hãy thử truy cập mysql:

$ mysql -u user_name -p

Nếu bạn có thể đăng nhập và truy cập bảng điều khiển MySQL thì không sao. Tuyệt quá!

NHƯNG , nếu như tôi, bạn phải đối mặt với lỗi "biến không xác định sql_mode" , điều đó chỉ ra rằng sql_mode là một tùy chọn cho mysqld , bạn sẽ phải quay lại, chỉnh sửa lại tệp mysql.cnf và thay đổi [mysql]thành [mysqld]. Khởi động lại dịch vụ MySQL và thực hiện bài kiểm tra cuối cùng cố gắng đăng nhập vào bảng điều khiển MySQL. Nó đây rồi!


1
Tôi thực sự muốn giới thiệu cách tiếp cận đã nói ở trên hơn là đặt nó vào phiên, nhờ @ alexandre-ribeiro. Đối với những người có Ubuntu 16.04 và mysql 5.7.x, chỉnh sửa tốt hơn các tập tin và nhập ini chỉ sql_mode = <các phương thức> dưới [mysqld] nhóm, như tuyên bố chống lại [mysql] không làm việc, theo kinh nghiệm của tôi.
codar chiến binh

Tôi có MySQL 5.7.22. Thật lạ, nhưng tôi đã phải xóa cả STRICT_TRANS_TABLES và ONLY_FULL_GROUP_BY khỏi khai báo sql_mode trong my.cnf, như được hiển thị ở trên, để điều này hoạt động. Trong thực tế, tôi chỉ muốn xóa chế độ CHỈ_ULL_GROUP_BY. Nếu tôi thực hiện "đặt toàn cầu / phiên sql_mode = ...", tôi chỉ có thể xóa CHỈ_ULL_GROUP_BY mà không phải xóa STRICT_TRANS_TABLES để nó hoạt động. Nhưng vì điều này không tồn tại khi khởi động lại, nên nó không được sử dụng nhiều cho tôi.
RayCh

12

Đây là những gì tôi đã thực hiện để sửa lỗi trên bàn làm việc của Mysql:

Trước khi tôi nhận được giá trị hiện tại với lệnh dưới đây

SELECT @@sql_mode 

sau đó, tôi đã xóa khóa ONLY_FULL_GROUP_BY khỏi danh sách và tôi đã dán lệnh bên dưới

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

Đối với Mac OS Mojave (10.14) Thiết bị đầu cuối mở

$ 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

Dán sau:

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

Shortkeys để Save & Exit nano: Ctrl+xyEnter

Lưu ý: Bạn có thể cần cập nhậtmysql-5.7.24-macos10.14-x86_64trong các lệnh này, chỉ cần kiểm tra tên thư mục chính xác bạn có trong/usr/local/

Hy vọng nó sẽ giúp được ai đó!


10

Thêm hoặc xóa chế độ để sql_mode

MySQL 5.7.9 trở lên

Để thêm hoặc xóa chế độ khỏi sql_mode, bạn có thể sử dụng list_addvà các list_dropchức năng.

Để xóa chế độ khỏi hiện tại SESSION.sql_mode, bạn có thể sử dụng một trong các cách sau:

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');

Để xóa chế độ khỏi chế độ GLOBAL.sql_modevẫn tồn tại cho hoạt động thời gian chạy hiện tại , cho đến khi dịch vụ được khởi động lại .

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

MySQL 5.7.8 trở lên

sql_modegiá trị là một chuỗi các chế độ CSV, bạn sẽ cần đảm bảo rằng chuỗi không chứa dấu phẩy dư, có thể được thực hiện bằng cách sử dụng TRIM(BOTH ',' FROM ...).

Để xóa chế độ khỏi sql_modebiến, bạn sẽ muốn sử dụng REPLACE()cùng với TRIM()để đảm bảo mọi dấu phẩy còn lại được xóa.

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', ''));

Để thêm một chế độ cho sql_modebiến, bạn sẽ muốn sử dụng CONCAT_WS(',', ...), để đảm bảo dấu phẩy được nối với các chế độ hiện tại và TRIM()để đảm bảo mọi dấu phẩy còn lại được xóa.

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));

LƯU Ý: Thay đổi GLOBALbiến không truyền sang SESSIONbiến, cho đến khi kết nối mới được thiết lập.

Các GLOBALbiến sẽ kéo dài cho đến khi dịch vụ chạy được khởi động lại.

Các SESSIONbiến sẽ tồn tại cho kết nối hiện tại, cho đến khi kết nối được khép kín và một kết nối mới được thiết lập.


Trở lại GLOBAL.sql_mode

SET sql_mode = 'ONLY_FULL_GROUP_BY';được thực hiện mà không có công cụ GLOBALsửa đổi, thay đổi chỉ ảnh hưởng đến SESSIONgiá trị trạng thái hiện tại , cũng liên quan đến @@sql_mode. Để xóa nó và trở về mặc định toàn cầu trên giá trị khởi động lại máy chủ , bạn sẽ muốn sử dụng giá trị từ đó @@GLOBAL.sql_mode. [sic]

SESSIONGiá trị hiện tại chỉ hợp lệ cho kết nối hiện tại. Kết nối lại với máy chủ sẽ hoàn nguyên giá trị trở lại GLOBAL giá trị.

Để hoàn nguyên giá trị trạng thái phiên hiện tại về giá trị toàn cầu hiện tại, bạn có thể sử dụng một trong các cách sau:

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

Thay đổi SESSION.sql_modegiá trị thànhONLY_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 |
+--------------------+----------------------------------------------+

Hoàn nguyên SESSION.sql_modegiá trị về GLOBAL.sql_modegiá trị

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 |
+----------------------------------------------+----------------------------------------------+

Máy chủ khởi động lại liên tục sql_mode

Để đặt chế độ SQL khi khởi động máy chủ, hãy sử dụng --sql-mode="modes"tùy chọn trên dòng lệnh hoặc sql-mode="modes"trong tệp tùy chọn, chẳng hạn như my.cnf (hệ điều hành Unix) hoặc my.ini (Windows). [sic]

Vui lòng xem phiên bản MySQL của bạn để xác định các chế độ được hỗ trợ và mặc định .

[mysqld]

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

sql_modeGiá trị mặc định

Vì các giá trị tài liệu MySQL trên mỗi phiên bản đã bị xóa, tôi đã thêm chúng vào đây để bạn tham khảo.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Bỏ qua

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

Nếu bạn đang sử dụng MySQL 8.0.11, bạn cần xóa 'NO_AUTO_CREATE_USER' khỏi chế độ sql.

Thêm dòng sau trong tệp /etc/mysql/my.cnfvà tiêu đề [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

cho đến nay câu trả lời này hoạt động cho 8.0.13
tomexsans

7

Tôi đang sử dụng học thuyết và tôi đã thêm driverOptions trong doctrine.local.php của mình:

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',''))"
                ),
            ),
        ),
    ),
));

Trong phpmyadmin, người dùng cần được kích hoạt SUPER trong các đặc quyền.


3
Sử dụng ký hiệu yaml để định cấu hình Doctrine (như được thực hiện trong Symfony), bạn cần sử dụng "1002" thay vì "PDO :: MYSQL_ATTR_INIT_COMMAND", nhưng đây là những gì tôi đã tìm kiếm vài tuần trước và không thể tìm thấy ngoài. Cảm ơn giải pháp của bạn! Đã làm cho tôi.
Arvid

5

Đối với ai đang chạy VPS / Máy chủ với cPanel / WHM , bạn có thể thực hiện các thao tác sau để vô hiệu hóa vĩnh viễn CHỈ_ULL_GROUP_BY

Bạn cần quyền truy cập root (trên VPS hoặc máy chủ chuyên dụng)

  1. Nhập WHM với quyền root và chạy phpMyAdmin

  2. Nhấp vào Biến, tìm kiếm sql_mode, nhấp vào 'Chỉnh sửa' và sao chép toàn bộ dòng bên trong hộp văn bản đó

ví dụ: sao chép này:

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. Kết nối với máy chủ của bạn thông qua SFTP - SSH (root) và tải xuống tệp /etc/my.cnf

  2. Mở bằng my.cnftệp soạn thảo văn bản trên PC cục bộ của bạn và dán vào đó (bên dưới [mysqld]phần) toàn bộ dòng bạn đã sao chép ở bước (2) nhưng xóaONLY_FULL_GROUP_BY,

ví dụ: dán cái này:

# 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. Lưu my.cnftệp và tải lại vào/etc/

  2. Nhập WHM và đi đến "WHM> Khởi động lại dịch vụ> Máy chủ SQL (MySQL)" và khởi động lại dịch vụ


4

Tôi đang làm việc với mysql và đã đăng ký với người dùng root, giải pháp phù hợp với tôi là:

mysql SET SESSION sql_mode = (CHỌN REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));


3

Đây là một giải pháp vĩnh viễn cho MySql 5.7+ trên 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

Nếu bạn có thể đăng nhập mà không gặp lỗi - bạn nên thiết lập tất cả ngay bây giờ.


1

Bạn có thể vô hiệu hóa nó bằng tập tin cấu hình my.cnf:

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

Vì vậy, trong macOS 10.12, nó ở usr/local/etc/my.cnf. Bạn có thể chỉnh sửa sql_modetại đây:

# 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

Đây là giải pháp của tôi thay đổi cấu hình Mysql thông qua bảng điều khiển phpmyadmin:

Để khắc phục "điều này không tương thích với sql_mode = only_full_group_by": Mở Trang chủ phpmyadmin và goto và chọn menu con 'Biến'. Cuộn xuống để tìm chế độ sql. Chỉnh sửa chế độ sql và xóa 'ONLY_FULL_GROUP_BY' Lưu nó.


0

với phiên bản MySQL 5.7.28 kiểm tra bằng cách sử dụng
SELECT @@sql_mode; và cập nhật với

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.