MySQL隐式转换带来的BUG

2024-06-01 21:27:40 2

问题sql

SELECT
IF(o.type = 'A', '优惠', '原价') AS type,
SUM(amount) AS sum
FROM order o
WHERE
GROUP BY IF(o.type = 'A', '优惠', '原价')


实际type是tinyint 0-优惠 1-原价

这里用o.type做判断,  A 实际执行了隐式类型转换

类似这样

SELECT 'A' + 0

为0;

歪打正着, 也能"正常"运行


我基于上面的惯性思维, 写下了下面这段sql


SELECT
DATE_FORMAT(create_date, '%Y-%m') AS month,
SUM(
IF(o.type = 'A',
	IF(amount IS NULL, 0, amount), 
	0)
) AS 优惠金额,
SUM(
IF(o.type = 'B',
	IF(amount IS NULL, 0, amount), 
	0)
) AS 原价金额
FROM order o
GROUP BY DATE_FORMAT(create_date, '%Y-%m');

结果原价金额与优惠金额一致了, 因为SELECT 'A' + 0SELECT 'B' + 0  结果都是0

PostgreSQL bytea与字符串互转

假如name是bytea类型的字段新增时INSERT INTO users (name) VALUES ('zhangsan'::bytea)查询时SELECT CONVERT_FROM(name, 'UTF-8') AS name FROM users
2024-11-04

MySQL隐式转换带来的BUG

问题sqlSELECT IF(o.type = 'A', '优惠', '原价') AS type, SUM(amount) AS sum FROM order o WHERE GROUP BY IF(o.type = 'A', '优惠', '原价')实际type是tinyint 0-优惠 1-原价这
2024-06-01

关于redis缓存时间设置可能导致的bug

看到在项目代码中有人先调用redisTemplate的方法判断某个key是否存在,然后再调用redisTemplate的方法拿到这个key里的数据。但是,在设置了key缓存时间的情况下,这个逻辑就会出错。比如第一步这个key存在,但是紧接着key过期了,后面就会拿不到这个key,造成后面的逻辑出错所
2020-06-19

事务隔离级别引起的问题

最近碰到了一个事务隔离级别引起的bug在一段业务逻辑中,需要查询两次标志位,但两次查询到的都是同样的结果,一开始以为是hibernate缓存的原因然后一通操作,发现两次查询发了两次sql,于是排除hibernate最后怀疑是隔离级别的问题,在手动设置隔离级别为“读已提交”后,问题解决
2020-07-16

多数据源 单库操作事务不回滚

项目配置了多数据源,之前操作主数据源,直接加上@Transactional(rollbackFor = Exception.class),没有任何问题最近操作其他数据源并做测试的时候,发现int i = 1 / 0并不会回滚,各种排查,从数据库引擎到注解@Transactional使用规范和异常处理
2020-07-27

hutool-http链式调用参数丢失

版本hutool-http-5.2.5如下代码,pathParams的参数会丢失 HttpRequest request = cn.hutool.http.HttpUtil.createRequest(method, url).timeout(TIMEOUT) .
2020-08-26

jpa方法参数必须加上@Param

void deleteByKl(String kl);线上可能报错原因可能是编译时没有加-parameters这个参数, 编译后丢失了参数名称, 使得反射拿不到对应参数需要加上注解void deleteByKl(@Param("kl") String kl);同理public ResultVO de
2020-09-28

map为空时调用keySet()传给jpa导致的bug

userService.deleteNotInId(userMap.keySet()); @Modifying @Query(value = "DELETE FROM user WHERE id NOT IN (:iqs)", nativeQuery = true) void deleteNotIn
2020-09-29

JPA IN or NOT IN 查询时 只能传List

JPA IN 查询时 只能传List
2020-10-28

Spring Boot项目中使用RedisTemplate.delete() 删除指定key失败的解决办法

https://blog.csdn.net/hello_world_qwp/article/details/85763286上面这篇博客扯一大堆, 居然还分析源码实际只是自定义了key的序列化方式导致最终操作redis的时候序列化的key与预期的key不一致而已, 自然就删不掉redis中的数据了
2020-11-26

Dubbo连接不到对应服务

尝试删除C:\Users\用户\nacos该目录, 然后重启项目原因根据官方图,dubbo调用者需要通过注册中心(例如:ZK、nacos)注册信息, 获取提供者,但是如果频繁往ZK获取信息,肯定会存在单点故障问题, 所以dubbo提供了将提供者信息缓存在本地的方法。 Dubbo在订阅注册中心的回调
2021-01-29