一、背景
数据库需要迁移到另一台电脑,测试库,新的电脑Windows升级到2016,新旧两台电脑的MySQL数据库版本相同,但是出现了一些问题。
二、问题:测试项目原本连接的MySQL可以正常使用,但是切换连接后报错
2.1GROUP BY分组问题
报错: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘xxx.xx’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因:这个错误是由于 MySQL 的 SQL 模式设置为 ONLY_FULL_GROUP_BY,它要求在使用 GROUP BY 语句时,SELECT 列表中的每个非聚合列都必须出现在 GROUP BY 子句中。
解决:
SELECT @@sql_mode;
#旧库
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#新库
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
#更改新库的模式值
SET GLOBAL sql_mode =
'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
然后重启项目。
2.2数据库字符集问题
报错:Incorrect string value: ‘\xE6\xB3\x89\xE5\xB1\xB1…’ for column ‘name’ at row 1
原因:字符集和排序规则不一致
解决:修改数据库的编码和原本的数据库保持一致。
如果使用了自定义函数,那么也应当保持字符集一致,旧库函数中返回字符集为’CHARSET utf8’,而新库需要使用’CHARSET utf8mb4’,即使两个库版本一致,但是不修改新库的字符集就会报错。
CREATE DEFINER=`root`@`%` FUNCTION `convertName`(P_NAME VARCHAR(255))
RETURNS varchar(255) CHARSET utf8mb4
utf8mb4 字符集支持更广泛的字符范围和更好的数据兼容性
SHOW CREATE FUNCTION convertName;
#复制Create function
#修改编码
#所有相关函数都修改编码为utf8mb4
三、访问报错
3.1访问地址报错
问题:访问的项目地址后多出一节"?exception.message=Error+decoding+flow+execution"
解决:清除浏览器数据,然后关闭重启浏览器,问题解决。