22026 — string_data_length_mismatch
22026
速览
位串值与声明长度不匹配。固定 varbit.c 路径报告 bit string length %d does not match type bit(%d);位运算操作数有单独的长度不匹配报文。
| 字段 | 值 |
|---|---|
| SQLSTATE | 22026 |
| 条件名 | string_data_length_mismatch |
| 状态 | 有效 |
| 已知存在于 | 7.4 |
| 锁定快照 | 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3 |
| 宏 | ERRCODE_STRING_DATA_LENGTH_MISMATCH |
| 别名 | — |
报文
固定守卫使用以下首要文本:
| 守卫 | 首要文本 |
|---|---|
bit(n) 长度不匹配 |
bit string length %d does not match type bit(%d) |
bit_and 操作数 |
cannot AND bit strings of different sizes |
bit_or 操作数 |
cannot OR bit strings of different sizes |
bitxor 操作数 |
cannot XOR bit strings of different sizes |
含义
22026 覆盖精确长度的 bit(n) 边界和位运算。固定 bit() 输入路径将实际位长与声明的 bit(n) 长度比较;隐式转换会报告 bit string length %d does not match type bit(%d),显式 bit(n) 转换则会截断或补零。varbit(n) 使用不同约束:隐式值过长时使用 22001,显式转换会截断到最大长度。AND、OR 和 XOR 函数另行比较两个操作数的长度,长度不同时使用 22026。
诊断
先判断首要报文指出的是 bit(n) typmod 还是位运算符。对于 typmod 报文,比较源位长和目标精确长度,并确认边界是隐式赋值/转换还是明确要求的显式转换。varbit(n) 过长应寻找 22001;位运算报文则检查两个操作数。字符宽度和编码失败属于其他 SQLSTATE 路径。
处理
使隐式 bit(n) 值恰好达到声明长度。只有在确实需要截断或补零时才使用显式转换;位运算需要同长时,先调整两个操作数。如果 ERROR 发生在显式事务中,应先 ROLLBACK 或回滚到既有保存点再重试;自动提交可重试修正后的动作。
版本
锁定目录从 7.4 起记录该条件;本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。
相关
来源
精确长度守卫在 src/backend/utils/adt/varbit.c#L354-357;bit(n) 与 varbit(n) 的隐式/显式转换见 #L385-414 和 #L736-765。位运算尺寸守卫见 #L1257-1343。结构化证据记录保留报文角色与范围;本页未运行自然案例。