本地Windows正常的MySQL查询在Linux服务器报错求助
问题分析与解决方案
核心原因:MySQL 8.0与MariaDB的关键字解析/换行符差异
你的查询在本地MariaDB正常运行,但部署到MySQL 8.0时报错,主要有两个可能的根源:
1. rank是MySQL 8.0的保留关键字
MySQL 8.0将rank列为保留关键字(用于窗口函数RANK()),而MariaDB 10.4在默认配置下允许直接将rank作为字段名使用,无需转义。当MySQL 8.0解析0 - rank + 1时,会将rank识别为关键字而非字段名,进而触发语法错误。
2. 换行符格式不兼容
本地开发环境使用Windows的CRLF换行符,部署到Linux服务器后,查询中的CRLF未被正确转换为LF,导致MySQL解析查询时出现字符异常,报错位置恰好落在+ 1附近。
无需修改查询语句的解决方案
针对关键字冲突的解决方法
修改MySQL 8.0的sql_mode配置,关闭严格的关键字检查:
- 登录MySQL服务器,执行以下命令临时生效:
SET GLOBAL sql_mode = 'ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
- 若要永久生效,编辑MySQL配置文件(通常是
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),添加/修改:
[mysqld] sql_mode = ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- 重启MySQL服务:
sudo systemctl restart mysql
针对换行符问题的解决方法
确保TypeScript编译时将代码中的换行符转换为Linux兼容的LF:
- 在
tsconfig.json中添加配置:
{ "compilerOptions": { "newLine": "lf" } }
- 重新编译并部署代码即可。
内容的提问来源于stack exchange,提问作者Muhammad Nihad
相关产品推荐
相关产品推荐

