文章目录
有时候mysql版本不一致,也是个巨大的地雷啊~ 踩着了那就开花喽~
背景
出错日志
一个大版本上线的时候,测试突然说卡住了后台报错,=_=|| 跑去后台load日志,看到这样一句话
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'FLOAT)
嗯哼,sql语句报错,还是不支持的语法:cast(expression as float)
cast 介绍
天狗的日常 - 参考文档
cast(表达式 AS 目标数据类型)
从下面表格中可以看到,好像不支持Float类型!!!
支持的 TYPE 类型 | 描述 |
---|---|
BINARY | 二进制型 |
CHAR | 字符型 |
DATE | 日期,格式为 ‘YYYY-MM-DD’ |
DATETIME | 日期加具体的时间,格式为 ‘YYYY-MM-DD HH:MM:SS’ |
TIME | 时间,格式为 ‘HH:MM:SS’ |
DECIMAL | float 型 |
SIGNED | int 型 |
UNSIGNED | 无符号int |
问题查找
这是个很奇怪的问题,为啥开发和测试环境都ok,但是正式环境不一样呢!那就先看版本号吧
环境 | mysql版本 |
---|---|
dev | 8.0.21 |
test | 8.0.22 |
prod | 8.0.16 |
大版本一致,这。。。在网上搜了一通,也没找到原因,那就只能去官网更新日志看看喽
mysql 官方升级日志
看出来了么,官方文档说,从8.0.17版本才开始CAST才支持FLOAT类型。好巧不巧,prod是8.0.16,真是擦肩而过啊~~
解决方案
升级mysql版本
升级版本是个有难度的活,还得找一个业务不繁忙的时间点,难度较大,暂时不能使用
转换为decimal
从cast介绍情况看,可以将sql语句换为cast(expression AS decimal)
暂时解决问题!
后记
- 需要将dev/test/prod各个环境中的所有框架保持同一版本,不然出错了很难排查!
- 有空了多看下官方升级日志,里面都是宝贝呢!