You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LINQ查询MySQL出现BIGINT UNSIGNED值越界问题求助

解决MySQL无符号整数取反导致的BIGINT UNSIGNED溢出问题

问题根源:validity_months是无符号SMALLINT类型,MySQL中无符号整数无法存储负数,当EF Core生成validity_months * -1时,会先执行乘法运算,直接触发无符号数溢出错误,后续的CAST转换无法提前规避报错。

正确的LINQ写法

要让EF Core生成先转换为有符号整数、再取反的SQL,而非先运算再转换。通过显式转换字段类型后取反即可实现:

var query = db.table_1
    .AsNoTracking()
    .Include(b => b.table_2)
    .ThenInclude(t => t.table_3)
    .Where(e => e.Date <= DateTime.UtcNow.AddMonths(e.table_2.ValidityMonths))
    .Where(e => e.Date >= DateTime.UtcNow.AddMonths(-Convert.ToInt32(e.table_2.ValidityMonths)));

生成的SQL变化

修改后EF Core会生成如下WHERE条件,先将无符号字段转为有符号再取反,彻底避免溢出:

WHERE (`s`.`date` <= DATE_ADD(UTC_TIMESTAMP(), INTERVAL CAST(`s0`.`validity_months` AS signed) month)) 
AND (`s`.`date` >= DATE_ADD(UTC_TIMESTAMP(), INTERVAL -CAST(`s0`.`validity_months` AS signed) month));

关于EF Core的问题

这确实属于EF Core的设计疏漏:它没有针对无符号整数的取反操作做特殊处理,默认生成了先运算再转换的SQL,导致MySQL抛出溢出错误。你可以在EF Core官方仓库提交issue反馈该场景。

内容的提问来源于stack exchange,提问作者CiucaS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 02:54:23