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
account
có 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