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ường name 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_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION.

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#:~:text=Strict%20mode%20controls,CREATE%20TABLE.

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