đặt sql_mode toàn cục trong mysql


91

Tôi đang cố gắng đặt sql_mode trong mysql nhưng nó báo lỗi.

Chỉ huy:

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

Đây không phải là cách thích hợp để đặt nhiều chế độ? Ưu điểm của việc thiết lập chế độ phiên và toàn cục là gì? cái nào được ưu tiên? Tôi có những người dùng khác nhau đang cố gắng cập nhật cơ sở dữ liệu với các giá trị UNC khác nhau và đã ghi od thiết lập chế độ phiên thành 'NO_BACKSLASH_ESCAPES', tôi mặc dù việc đặt chế độ toàn cầu cho điều này là hợp lý. Điều này có nghĩa không?

Làm ơn cho tôi biết.

Cảm ơn.


Những trích dẫn sai lầm đó thực sự làm phiền tôi; p. Như những người khác đã nói, tôi chắc chắn, điều này chắc chắn không đúng chỉ vì điều đó.
dyasta

Câu trả lời:


205

BTW, nếu bạn đặt hình cầu trong MySQL:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Điều này sẽ không thiết lập nó VĨNH VIỄN và nó sẽ hoàn nguyên sau mỗi lần khởi động lại.

Vì vậy, bạn nên đặt điều này trong tệp cấu hình của mình (ví dụ: /etc/mysql/my.cnftrong phần [mysqld]), để các thay đổi vẫn có hiệu lực sau khi khởi động lại MySQL:

Tệp cấu hình: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

CẬP NHẬT: Các phiên bản mới hơn của Mysql (ví dụ: 5.7.8 trở lên) có thể yêu cầu cú pháp hơi khác:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

Đảm bảo rằng có một dấu gạch ngang giữa sql-modekhông phải gạch dưới và các chế độ được đặt trong dấu ngoặc kép.

Luôn tham khảo Tài liệu MySQL cho phiên bản của bạn để xem các tùy chọn chế độ sql .


2
Cảm ơn bạn, cài đặt trong my.cnf đã giúp tôi. Đối với những người quan tâm, trang này cho bạn biết những gì sql_modes mặc định là trong 5,7 trở lên: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard

2
Phiên bản 5.7 lưu ý lên! Đó là vấn đề.
Ernestas Stankevičius

Trong một ứng dụng web thực tế, truy vấn thứ hai hoạt động. Tôi vừa thêm một truy vấn khác sau truy vấn kết nối mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Cảm ơn Chad!
GTodorov

1
Trong 5.7.20, và đối với trường hợp mysql.ini, sử dụng một dấu gạch dưới và quên có dấu ngoặc kép làm việc tốt, như vậy:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

Tôi đã giải quyết nó.

chế độ đúng là:

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

17
Chú ý: Theo kinh nghiệm của chúng tôi điều này không giữ lại các thiết lập sau khi khởi động lại MySQL ...
Chadwick Meyer

1
Có, điều này không giữ lại cài đặt sau khi khởi động lại
prakashpoudel

4
Để giữ lại nó sau khi khởi động lại cho unix, tôi phải tạo một tệp ~ / .my.cnf và thêm [mysqld] sql_mode = "<new mode>". Hope this helps
Raman Singh

27

Đặt chế độ sql vĩnh viễn bằng tệp cấu hình mysql.

Trong trường hợp của tôi, tôi phải thay đổi tệp /etc/mysql/mysql.conf.d/mysqld.cnfnhư mysql.conf.dđược bao gồm trong /etc/mysql/my.cnf. tôi thay đổi điều này trong [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"

chỉ cần loại bỏ ONLY_FULL_GROUP_BYchế độ sql vì nó đã gây ra sự cố.

Tôi đang sử dụng ubuntu 16.04, php 7và mysql --version cho tôi nàymysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Sau khi thay đổi này chạy lệnh bên dưới

sudo service mysql stop
sudo service mysql start

Bây giờ hãy kiểm tra các chế độ sql bằng truy vấn này SELECT @@sql_modevà bạn sẽ nhận được các chế độ mà bạn vừa đặt.


14

Sao chép vào tệp cấu hình: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL khởi động lại.

Hoặc bạn cũng có thể làm

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL khởi động lại.


2
Tôi nghĩ nó sql_modethay vì sql-mode.
Raman Sahasi

13

Đối với những người sử dụng googling lỗi này cho MySQL 8.

MySQL 8.0.11 xóa 'NO_AUTO_CREATE_USER' khỏi chế độ sql.

MySQL 5.7: Sử dụng GRANT để tạo người dùng. Thay vào đó, hãy sử dụng CREATE USER. Việc tuân theo thực tiễn này làm cho chế độ SQL NO_AUTO_CREATE_USER không quan trọng đối với các câu lệnh GRANT, vì vậy nó cũng không được dùng nữa. MySQL 8.0.11: Sử dụng GRANT để tạo người dùng. Thay vào đó, hãy sử dụng CREATE USER. Việc tuân theo thực tiễn này làm cho chế độ SQL NO_AUTO_CREATE_USER không quan trọng đối với các câu lệnh GRANT, vì vậy nó cũng bị loại bỏ.

Lấy từ đây

Vì vậy, của bạn sql_modecó thể như thế này:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Hoặc nếu đang sử dụng Docker, bạn có thể thêm lệnh tiếp theo vào docker-compos.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}

3

Đối với thay đổi tạm thời, sử dụng lệnh sau

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

Đối với thay đổi vĩnh viễn: đi tới tệp cấu hình /etc/my.cnf hoặc /etc/mysql/mysql.conf.d/mysqld.cnf và thêm các dòng sau rồi khởi động lại dịch vụ 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"

2

Truy cập cơ sở dữ liệu với tư cách người dùng quản trị viên (có thể root).

Kiểm tra SQL_mode hiện tại

mysql> SELECT @@sql_mode;

Để đặt một sql_mode mới, hãy thoát khỏi cơ sở dữ liệu, tạo một tệp

nano /etc/mysql/conf.d/<filename>.cnf 

với nội dung sql_mode của bạn

[mysqld]
sql_mode=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

mysql> sudo service mysql stop
mysql> sudo service mysql start

Chúng tôi tạo một tệp trong thư mục /etc/mysql/conf.d/ vì trong tệp cấu hình chính /etc/mysql/my.cnf lệnh được viết để bao gồm tất cả các tệp cài đặt từ thư mục / etc / mysql / conf. d /


1

Trong trường hợp của tôi, tôi phải thay đổi tệp, hãy /etc/mysql/mysql.conf.d/mysqld.cnfthay đổi tệp này trong [ mysqld]

Dán dòng này vào mysqldphầ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"

1

Tôi vừa gặp sự cố tương tự trong đó MySQL (5.6.45) không chấp nhận sql_modetừ bất kỳ tệp cấu hình nào.

Giải pháp là thêm init_file = /etc/mysql/mysql-init.sqlvào tệp cấu hình và sau đó thực thi SET GLOBAL sql_mode = '';trong đó.


1

Kiểm tra tài liệu của sql_mode

Phương pháp 1:

Kiểm tra giá trị mặc định của 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";

Phương pháp 2:

Truy cập phpmyadmin để chỉnh sửa sql_mode

  • Đăng nhập phpmyadmin và mở localhost
  • Top on Các biến hiển thị ở trên cùng trong các mục menu và tìm kiếm chế độ sql
  • Nhấp vào nút chỉnh sửa để sửa đổi sql_mode dựa trên yêu cầu của bạn
  • Lưu các thay đổi

cài đặt chế độ sql trong phpmyadmin

Khởi động lại máy chủ sau khi thực hiện những điều trên


1

Trong trường hợp của tôi, mysql và ubuntu 18.04

Tôi đã đặt nó vĩnh viễn bằng lệnh này

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

Nối dòng sau cấu hình. Xem ví dụ được đánh dấu trong hình ảnh bên dưới.

sql_mode = ""

Lưu ý: Bạn cũng có thể thêm các chế độ khác nhau ở đây, tùy thuộc vào nhu cầu của bạn NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Xem Tài liệuTài liệu tham khảo các chế độ sql có sẵn

thêm chế độ sql

Sau đó lưu lại. Sau khi lưu, bạn cần khởi động lại dịch vụ mysql của mình, hãy làm theo lệnh dưới đây:

sudo service mysql restart

Hi vọng điêu nay co ich :-)


0

Nếu ai đó muốn đặt nó chỉ cho phiên hiện tại thì hãy sử dụng lệnh sau

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

-3
đặt sql_mode toàn cầu = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, 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.