MySQL是一個廣泛使用的關系型數據庫管理系統,然而升級到5.7版本后會存在一些問題。
首先,MySQL 5.7中將NO_ZERO_DATE和NO_ZERO_IN_DATE sql mode默認設置為了strict mode,這意味著在插入數據時,日期格式不能為0000-00-00。如果之前的代碼中有相關語句并且有數據插入了0000-00-00,則會導致插入錯誤。
//舊代碼 SET sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; INSERT INTO mytable (id, name, create_time) values ('1', 'test', '0000-00-00'); //新版本,會導致錯誤 INSERT INTO mytable (id, name, create_time) values ('1', 'test', '0000-00-00');
其次,MySQL 5.7版本中,必須顯示指定GROUP BY的字段,而之前的版本可以隱式指定。如果代碼中存在隱式的GROUP BY語句,則會報錯。
//舊代碼,會按name隱式GROUP BY排序 SELECT name, count(*) FROM mytable GROUP BY name; //新版本,會報錯 SELECT name, count(*) FROM mytable GROUP BY name;
此外,在MySQL 5.7版本中,引入了新的utf8mb4字符集,代表每個字符可以使用4個字節存儲,而之前則是3個字節。如果數據庫中之前的表使用的是utf8字符集,則需要修改表結構,否則會出現長度錯誤。
//舊代碼,無法支持utf8mb4 CREATE TABLE mytable ( id INT(11) NOT NULL AUTO_INCREMENT, content VARCHAR(255) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; //新版本,需要修改為utf8mb4 CREATE TABLE mytable ( id INT(11) NOT NULL AUTO_INCREMENT, content VARCHAR(255) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
綜上,升級MySQL到5.7版本需要注意以上問題,及時進行代碼和表結構的修改,以避免出現問題。
上一篇c json 多重解析