SQL使用~运算符操作BIGINT字段报numeric类型无效错误如何解决
错误产生原因
你使用的常量576460752303423488未显式声明类型时,会被SQL解析器默认判定为*NUMERIC(数值型)*类型,而~位非运算符仅支持整数类数据类型(INT、BIGINT等)作为操作数,不支持NUMERIC类型,因此触发了操作数类型不兼容的报错。
即使你的字段attrEx本身是BIGINT类型,且常量数值本身落在BIGINT的取值范围内,未做类型声明时依然会按默认的NUMERIC类型处理,导致运算类型不匹配。
解决方案
只需要将操作的常量显式转换为BIGINT类型即可正常运算,不同数据库的适配写法如下:
SQL Server 适配方案
两种写法均可生效:
- 显式CAST转换
UPDATE [Table] SET attrEx = attrEx & (~ CAST(576460752303423488 AS BIGINT)) WHERE attrEx != 0
- 常量后缀声明(直接声明为BIGINT类型常量)
UPDATE [Table] SET attrEx = attrEx & (~ 576460752303423488L) WHERE attrEx != 0
MySQL 适配方案
UPDATE `Table` SET attrEx = attrEx & (~ CAST(576460752303423488 AS SIGNED)) WHERE attrEx != 0 -- 如果使用无符号BIGINT,将SIGNED替换为UNSIGNED即可
预验证建议
执行UPDATE之前可先运行查询测试运算结果,避免误修改数据:
-- SQL Server 示例 SELECT attrEx, attrEx & (~ CAST(576460752303423488 AS BIGINT)) AS new_attrEx FROM [Table] WHERE attrEx != 0
内容的提问来源于stack exchange,提问作者user11004963
相关产品推荐
相关产品推荐

