Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đặt sql_mode vĩnh viễn trong MySQL (Windows)

Cấu hình sql_mode vĩnh viễn qua file my.ini/my.cnf

sql_mode kiểm soát hành vi SQL (strict mode, chỉ phép group by, v.v.). Thay đổi runtime chỉ có hiệu lực cho session hoặc global cho đến khi restart. Để vĩnh viễn, sửa file cấu hình.

Các bước trên Windows

  1. Tìm thư mục data: SELECT @@datadir; → ví dụ C:\ProgramData\MySQL\MySQL Server 8.0\Data\
  2. Tìm file my.ini (thường ở C:\ProgramData\MySQL\MySQL Server 8.0\my.ini) hoặc my.cnf trong thư mục data.
  3. Mở file bằng Notepad (Run as Administrator).
  4. Thêm/sửa dưới section [mysqld]:
    sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

    Hoặc mode truyền thống:

    sql_mode = "TRADITIONAL"
  5. Lưu file, khởi động lại dịch vụ MySQL:
    net stop mysql80
    net start mysql80
  6. Kiểm tra: SELECT @@sql_mode;

Các sql_mode phổ biến

Linux/Mac

File thường ở /etc/my.cnf, /etc/mysql/my.cnf, hoặc /etc/mysql/mysql.conf.d/mysqld.cnf. Sửa tương tự, restart: systemctl restart mysqld.

⚠️ Cảnh báo

  • Thay đổi sql_mode có thể làm vỡ ứng dụng cũ (INSERT không full column, date 0...).
  • Test kỹ trên staging trước khi áp production.
  • Khuyên dùng STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY làm baseline hiện đại.
ModeMô tả
STRICT_TRANS_TABLESTừ chối giá trị không hợp lệ (truncate, out of range) trong transactional tables
NO_ENGINE_SUBSTITUTIONBáo lỗi nếu engine yêu cầu không có, không tự thay thế
ONLY_FULL_GROUP_BYBắt buộc cột SELECT phải có trong GROUP BY hoặc aggregate (mặc định 5.7+)
NO_ZERO_DATEKhông cho phép '0000-00-00'
NO_ZERO_IN_DATEKhông cho phép tháng/ngày = 0
TRADITIONALTập hợp các mode strict (STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION)