MySQL đã thay đổi giá trị mặc định của biến sql_mode kể từ các bản phát hành trước đó đang phá vỡ mã hiện có trong một số ứng dụng. Hướng dẫn này giải thích cách thay đổi sql_mode theo các tính năng của ứng dụng. Nó cũng cung cấp các bước để bảo toàn giá trị này khi khởi động lại máy chủ.
Ghi chú :Bạn cũng có thể làm theo các hướng dẫn về MySQL - Cách cài đặt MySQL 8 trên Ubuntu, Cách xóa hoàn toàn MySQL khỏi Ubuntu và Tìm hiểu các truy vấn SQL cơ bản bằng MySQL.
Giá trị mặc định của biến sql_mode trong MySQL 8 như được hiển thị bên dưới.
# Default - sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Trong trường hợp của tôi, tùy chọn ONLY_FULL_GROUP_BY đang vi phạm mã, do đó tôi sẽ xóa nó để trình diễn
Cập nhật trực tiếp
Chúng tôi có thể cập nhật trực tiếp giá trị của sql_mode bằng cách sử dụng các lệnh như được hiển thị bên dưới.
# Login
mysql -u root -p
# Globally
SET GLOBAL sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
# Session
SET SESSION sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Giá trị sql_mode sẽ được thay đổi bằng các truy vấn được đề cập ở trên. Vấn đề là biến nhận lại giá trị mặc định của nó khi khởi động lại máy chủ. Chúng ta có thể giữ nguyên giá trị như được hiển thị trong phần tiếp theo.
Cập nhật vĩnh viễn
Chúng tôi có thể bảo toàn giá trị của sql_mode bằng cách cập nhật my.cnf tập tin. Vị trí của tệp này khác nhau dựa trên môi trường máy chủ và phiên bản. Các vị trí phổ biến nhất của tệp này bao gồm /etc/my.
Trên Linux Mint 18 , vị trí tệp là /
# Search the default config
mysqld --verbose --help | grep -A 1 "Default options"
# Output
Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
Máy chủ MySQL sẽ xem xét các vị trí được đề cập ở trên cho các cấu hình mặc định ở cả cấp hệ thống và cấp cục bộ. Cập nhật tệp my.cnf như hình bên dưới. Tôi đã sử dụng trình chỉnh sửa nano để trình diễn
# Update my.cnf
sudo nano /etc/mysql/my.cnf
# Scroll down and update the file as shown below
...
...
# # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
Bây giờ hãy lưu tệp và thoát khỏi trình chỉnh sửa. Đảm bảo bao gồm [mysqld] phía trên biến.
Khởi động lại máy chủ MySQL để đặt giá trị của biến sql_mode như được chúng tôi định cấu hình trong tệp my.cnf như được hiển thị ở trên.
# Using init
sudo /etc/init.d/mysqld restart
# OR
sudo /etc/init.d/mysql restart
# Using service
sudo service mysql restart
# Using systemd
sudo systemctl restart mysqld.service
# OR
sudo systemctl restart mysql
Tóm tắt
Trong hướng dẫn này, chúng tôi đã cập nhật giá trị của biến MySQL sql_mode và cũng bảo quản nó vĩnh viễn khi máy chủ khởi động lại.