# 22026 — string_data_length_mismatch

> PostgreSQL SQLSTATE 22026 的来源与诊断参考。
---

# 22026

## 速览 {#at-a-glance}
位串值与声明长度不匹配。固定 `varbit.c` 路径报告 `bit string length %d does not match type bit(%d)`；位运算操作数有单独的长度不匹配报文。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| 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` |
| 别名 | `—` |

<!-- source facts: data/errcodes/22026.json -->
<!-- END SQLSTATE FACTS -->

## 报文 {#messages}
固定守卫使用以下首要文本：

| 守卫 | 首要文本 |
| --- | --- |
| `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` |

## 含义 {#meaning}
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。

## 诊断 {#diagnosis}
先判断首要报文指出的是 `bit(n)` typmod 还是位运算符。对于 typmod 报文，比较源位长和目标精确长度，并确认边界是隐式赋值/转换还是明确要求的显式转换。`varbit(n)` 过长应寻找 22001；位运算报文则检查两个操作数。字符宽度和编码失败属于其他 SQLSTATE 路径。

## 处理 {#response}
使隐式 `bit(n)` 值恰好达到声明长度。只有在确实需要截断或补零时才使用显式转换；位运算需要同长时，先调整两个操作数。如果 ERROR 发生在显式事务中，应先 ROLLBACK 或回滚到既有保存点再重试；自动提交可重试修正后的动作。

## 版本 {#versions}
锁定目录从 7.4 起记录该条件；本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

## 相关 {#related}
[`22001`](../22001/)、[`22021`](../22021/)

## 来源 {#sources}
精确长度守卫在 [`src/backend/utils/adt/varbit.c#L354-357`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/varbit.c#L354)；`bit(n)` 与 `varbit(n)` 的隐式/显式转换见 [`#L385-414`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/varbit.c#L385) 和 [`#L736-765`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/varbit.c#L736)。位运算尺寸守卫见 [`#L1257-1343`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/varbit.c#L1257)。结构化[证据记录](../../data/evidence/22026.json)保留报文角色与范围；本页未运行自然案例。
