MySQL strict mode
Bối cảnh
Dự án đang dùng mysql5.6, chạy docker. Do máy mình chạy docker rất lag, nên mình quyết định cài native ở ngoài, không dùng thông qua docker.
Tuy nhiên, trên máy mình chỉ có mysql 5.7, rất nhiều data của các dự án khác cũng đang nằm ở đó nên mình không muốn gỡ ra để cài 5.6, nên quyết định là kệ nó, cứ dùng mysql 5.7 =))
Problem
Mọi thứ hoạt động khá ok cho đến khi chạy test. Có 1 số test bị fail khi dùng MySQL5.7, nhưng pass khi app dùng MySQL5.6
Sau khi debug thử, thì mình phát hiện ra 1 điều khá lạ, đó là:
- Bảng
accountcó trườngname IS NOT NULL - Trên MySQL5.6, nếu insert/update data mà name = null vào, NÓ VẪN INSERT BÌNH THƯỜNG. wtf luôn. Trên MySQL5.7 thì sẽ bị raise lỗi.
Nguyên nhân
Sau khi đi search thử thì là do thằng sqlmode.
MySQL 5.6 defaults to
NO_ENGINE_SUBSTITUTION.
MySQL 5.7 defaults to
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.
Mình có thể kiểm tra cái này trong mysql bằng lệnh:
show variables like 'sql_mode'\G
Vì MySQL 5.7 có cái STRICT mode kia nên nó raise lỗi, còn 5.6 thì không.
Solution
Tạm thời thay đổi sql_mode của 5.7 về thành giống 5.6 thôi =)) sau sửa lại sau :v
Thay đổi config này ở trong file ~/.my.cnf rồi restart lại mysql:
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION