MS-Access(SQL):使用小数参数时MID()函数的异常表现
MS Access SQL中MID()函数处理小数参数的异常行为解析
在MS Access的SQL环境中,使用MID()函数搭配小数类型的长度参数时,会出现与预期不符的结果,以下是具体测试与原因分析:
测试数据
表:Test ID Name Surname 1 Jamal Winstone 2 Joe Roan 3 Jake Tumble 4 Lea More
执行的SQL语句
SELECT MID(Surname, ID, LEN(Name)/2) FROM Test
实际返回结果
Expr1000 Wi oa mb e
预期结果
MID(Winstone, 1, LEN(Jamal)/2) = MID(Winstone, 1, 5/2) = MID(Winstone, 1, 2.5) = Wi (仅2个字符) MID(Roan, 2, LEN(Joe)/2) = MID(Roan, 2, 3/2) = MID(Roan, 2, 1.5) = o (仅1个字符) MID(Tumble, 3, LEN(Jake)/2) = MID(Tumble, 3, 4/2) = MID(Tumble, 3, 2) = mb (2个字符) MID(More, 4, LEN(Lea)/2) = MID(More, 4, 3/2) = MID(More, 4, 1.5) = e (仅1个字符)
原因分析
MS Access的MID()函数仅接受整数类型的长度参数,当传入小数时,会通过**银行家舍入法(四舍六入五成双)**将小数转换为整数,而非直接截断小数部分:
- 对于
2.5:舍入到最近的偶数2,因此取2个字符,得到Wi - 对于
1.5:舍入到最近的偶数2,因此从第2位开始取2个字符,得到oa - 整数参数
2直接生效,取2个字符得到mb - 对于
1.5舍入为2,但More从第4位开始仅剩1个字符,因此返回e
这种舍入规则是MS Access内部对非整数参数的默认处理逻辑,导致了结果与直接截断小数部分的预期不符。
内容的提问来源于stack exchange,提问作者monika95
相关产品推荐
相关产品推荐

