↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 状态码 / Class 22 数据异常

22001 string_data_right_truncation

22001 — string_data_right_truncation

ERROR 已实测 详解 实测通过

类别
Class 22 数据异常
严重等级
ERROR
条件名
string_data_right_truncation
宏名称
ERRCODE_STRING_DATA_RIGHT_TRUNCATION
最早已知存在
7.4
状态
有效

手册收录:8.1、8.2、8.3、8.4、9.0、9.1、9.2、9.3、9.4、9.5、9.6、10、11、12、13、14、15、16、17、18、19、20。此处仅表示同版本手册收录,运行证据仍以原核验构建为准。

版本覆盖

版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。

22001

速览 {#at-a-glance}

固定 varchar 路径报告 value too long for type character(%d);hstore、varbit 等路径会使用各自的具体变体。

共享案例创建 varchar_limits(value varchar(3)),用 'too-long' 触发 22001,再插入修复值 'ok' 并查询存储值。应在自动提交下逐条发送这些语句:触发语句预期失败,之后再执行修复语句。案例运行器在结束阶段负责清理对象。

CREATE TABLE varchar_limits (value varchar(3));
INSERT INTO varchar_limits VALUES ('too-long');
INSERT INTO varchar_limits VALUES ('ok');
SELECT value FROM varchar_limits;

校准实测 character varying(3) 拒绝超长值并报告 value too long for type character varying(3);修正值 ok 成功,运行器的两条自动提交会话均回到 IDLE。

报文 {#messages}

固定 character 和 varchar guard 以 ERROR 严重性报告 primary 模板 value too long for type character(%d) 与 value too long for type character varying(%d)。hstore 与 varbit 路径使用各自的 primary:string too long for hstore key、string too long for hstore value 和 bit string too long for type bit varying(%d)。这些源码组没有独立 DETAIL 或 HINT;本次运行只观察了上面的 varchar 模板。

含义 {#meaning}

当值无法满足字符串类型的长度契约时会出现 22001。PostgreSQL 按字符数而不是字节数计算 character(n) 和 character varying(n),因此 value too long for type character(%d) 中的 %d 指向响应里的 typmod。固定 varchar.c 是服务器端检查;hstore 键值和 bit string 有各自的路径和消息。

值进入类型的方式也会改变边界。varchar() 和 bpchar() 都接收 isExplicit 标志:赋值/输入转换遇到超出的非空格字符会报错,而显式 cast 到有界类型可以按 PostgreSQL 字符类型规则截断;超出的尾随空格和非空格字符处理不同。修改存储或校验前应先明确这个选择。

诊断 {#diagnosis}

保存 schema_name、table_name、column_name、datatype_name、routine 和完整 message。先从目录确认目标类型和 typmod,再按字符数而不是字节数测量实际值。区分赋值/插入、显式 cast,以及 hstore/bit 路径,因为它们的截断行为并不完全相同。

常见 varchar 路径要检查超出宽度的后缀是否全是尾随空格。只有尾随空格超出时可能适用字符类型的截断规则;有意义的非空格数据应视为契约被拒绝。固定源码消息说明的是类型宽度问题,不是一般编码或网络错误。

处置 {#response}

选择能保留数据契约的修复:校验并拒绝超长输入,有意扩大列/类型,或只在业务明确允许时显式 cast 截断。截断前保存原值和目标 typmod;静默裁剪标识符、键或审计文本可能写入与调用方意图不同的内容。本次固定案例使用自动提交,失败语句结束后会话仍为 IDLE;显式事务中应先回滚整个事务,或回滚到语句前建立的保存点,再重试修正值。修正输入或 schema 后重新转换,并核对保存后的字符长度。

版本 {#versions}

锁定目录从 7.4 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码覆盖为 PostgreSQL 18.6。

相关条件 {#related}

22003 是数值/范围越界,22007 是日期时间格式错误,22004 是独立的 NULL 契约。

来源 {#sources}

固定 character(n) 检查见 varchar.c#L300-L313,character varying(n) 检查见 varchar.c#L633-L640。PostgreSQL 18 的字符类型文档说明了字符数限制、尾随空格和显式 cast。结构化证据记录固定了源码 SHA,并区分 hstore/varbit 变体。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed 案例:varchar_width_overflow
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed 案例:varchar_width_overflow

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 value too long for type character(%d)

来源: 来源:src/backend/utils/adt/varchar.c @ REL_18_6

主消息 value too long for type character varying(%d)

来源: 来源:src/backend/utils/adt/varchar.c @ REL_18_6

主消息 string too long for hstore key

来源: 来源:contrib/hstore/hstore_io.c @ REL_18_6

主消息 string too long for hstore value

来源: 来源:contrib/hstore/hstore_io.c @ REL_18_6

主消息 bit string too long for type bit varying(%d)

来源: 来源:src/backend/utils/adt/varbit.c @ REL_18_6

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

varchar_width_overflow PG 10 / 18 有 SQL

触发

Insert a value longer than the declared varchar(3) width.

断言

  • SQLSTATE is 22001
  • The varchar width diagnostic names character varying(3)
  • The failed autocommit session remains IDLE
  • A representable value is stored after the error

处置

Use a value that satisfies the declared width or revise the data contract explicitly; do not rely on an explicit cast that silently truncates the input.

清理

Drop the case schema with an owner connection.

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 22 数据异常 Data Exception 70 个 ↗
22000 data_exception ERRCODE_DATA_EXCEPTION ERROR 7.4 起已知
数据异常的通用类别,具体原因见成员码。 有效
22001 string_data_right_truncation ERRCODE_STRING_DATA_RIGHT_TRUNCATION ERROR 7.4 起已知
值超过目标类型长度而被右截断。 有效
22002 null_value_no_indicator_parameter ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER ERROR 7.4 起已知
返回 NULL 但没有提供指示变量,见于 ECPG。 有效
22003 numeric_value_out_of_range ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE ERROR 7.4 起已知
数值超出目标类型范围,如整数溢出。 有效
22004 null_value_not_allowed ERRCODE_NULL_VALUE_NOT_ALLOWED ERROR 7.4 起已知
参数或值不允许为 NULL。 有效
22005 error_in_assignment ERRCODE_ERROR_IN_ASSIGNMENT ERROR 7.4 起已知
赋值违反目标变量契约,如变量声明为 CONSTANT。 有效
22007 invalid_datetime_format ERRCODE_INVALID_DATETIME_FORMAT ERROR 7.4 起已知
日期时间格式串无效,如 interval 格式错误。 有效
22008 datetime_field_overflow ERRCODE_DATETIME_FIELD_OVERFLOW ERROR 7.4 起已知
日期或时间字段取值越界。 有效
22009 invalid_time_zone_displacement_value ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE ERROR 7.4 起已知
时区偏移量超出支持范围。 有效
2200B escape_character_conflict ERRCODE_ESCAPE_CHARACTER_CONFLICT ERROR 7.4 起已知
转义字符与其他字符冲突。 有效
2200C invalid_use_of_escape_character ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER ERROR 7.4 起已知
转义字符用法无效,如 SIMILAR TO 模式错误。 有效
2200D invalid_escape_octet ERRCODE_INVALID_ESCAPE_OCTET ERROR 7.4 起已知
转义八位组无效的数据异常条件。 有效
2200F zero_length_character_string ERRCODE_ZERO_LENGTH_CHARACTER_STRING ERROR 7.4 起已知
操作拒绝了零长度字符串。 有效
2200G most_specific_type_mismatch ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH ERROR 7.4 起已知
无法确定值的最具体类型,类型不匹配。 有效
2200H sequence_generator_limit_exceeded ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED ERROR 10.0 起已知
nextval 触及序列的最大值或最小值。 有效
2200L not_an_xml_document ERRCODE_NOT_AN_XML_DOCUMENT ERROR 8.3.0 起已知
输入不满足 XML DOCUMENT 形式要求。 有效
2200M invalid_xml_document ERRCODE_INVALID_XML_DOCUMENT ERROR 8.3.0 起已知
XML 文档解析失败,文档无效。 有效
2200N invalid_xml_content ERRCODE_INVALID_XML_CONTENT ERROR 8.3.0 起已知
XML 内容无效,未通过 CONTENT 模式解析。 有效
2200S invalid_xml_comment ERRCODE_INVALID_XML_COMMENT ERROR 8.3.0 起已知
XML 注释无效,含 -- 或以 - 结尾。 有效
2200T invalid_xml_processing_instruction ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION ERROR 8.3.0 起已知
XML 处理指令无效,目标名或内容非法。 有效
22010 invalid_indicator_parameter_value ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE ERROR 7.4 起已知
指示参数取值不符合规则。 有效
22011 substring_error ERRCODE_SUBSTRING_ERROR ERROR 7.4 起已知
substring 长度参数为负等取子串错误。 有效
22012 division_by_zero ERRCODE_DIVISION_BY_ZERO ERROR 7.4 起已知
除法或取模运算遇到零除数。 有效
22013 invalid_preceding_or_following_size ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE ERROR 11.0 起已知
窗口帧的 PRECEDING/FOLLOWING 偏移为负。 有效
22014 invalid_argument_for_ntile_function ERRCODE_INVALID_ARGUMENT_FOR_NTILE ERROR 8.4.0 起已知
ntile 的桶数量必须大于零。 有效
22015 interval_field_overflow ERRCODE_INTERVAL_FIELD_OVERFLOW ERROR 7.4 起已知
interval 输入字段超出可接受范围。 有效
22016 invalid_argument_for_nth_value_function ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE ERROR 8.4.0 起已知
nth_value 的序号必须大于零。 有效
22018 invalid_character_value_for_cast ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST ERROR 7.4 起已知
字符值无法通过所要求的类型转换。 有效
22019 invalid_escape_character ERRCODE_INVALID_ESCAPE_CHARACTER ERROR 7.4 起已知
操作拒绝了给定的转义字符。 有效
2201B invalid_regular_expression ERRCODE_INVALID_REGULAR_EXPRESSION ERROR 7.4 起已知
正则表达式无效,编译或执行阶段被拒绝。 有效
2201E invalid_argument_for_logarithm ERRCODE_INVALID_ARGUMENT_FOR_LOG ERROR 8.0.0 起已知
对数函数参数为零或负数。 有效
2201F invalid_argument_for_power_function ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION ERROR 8.0.0 起已知
幂运算参数使实数结果无定义。 有效
2201G invalid_argument_for_width_bucket_function ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION ERROR 8.0.0 起已知
width_bucket 参数无效,如桶数非正。 有效
2201W invalid_row_count_in_limit_clause ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE ERROR 8.4.0 起已知
LIMIT 行数无效,不能为负。 有效
2201X invalid_row_count_in_result_offset_clause ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE ERROR 8.4.0 起已知
OFFSET 行数无效,不能为负。 有效
22020 invalid_limit_value 起已知
无效的限制值 有效
22021 character_not_in_repertoire ERRCODE_CHARACTER_NOT_IN_REPERTOIRE ERROR 7.4 起已知
字节序列对目标编码无效。 有效
22022 indicator_overflow ERRCODE_INDICATOR_OVERFLOW ERROR 7.4 起已知
指示变量容纳不下接口返回的结果。 有效
22023 invalid_parameter_value ERRCODE_INVALID_PARAMETER_VALUE ERROR 7.4 起已知
参数或选项取值超出允许范围。 有效
22024 unterminated_c_string ERRCODE_UNTERMINATED_C_STRING ERROR 7.4 起已知
C 风格字符串缺少终止符。 有效
22025 invalid_escape_sequence ERRCODE_INVALID_ESCAPE_SEQUENCE ERROR 7.4 起已知
转义序列无效,如 ESCAPE 参数非单字符。 有效
22026 string_data_length_mismatch ERRCODE_STRING_DATA_LENGTH_MISMATCH ERROR 7.4 起已知
位串长度与声明的类型长度不一致。 有效
22027 trim_error ERRCODE_TRIM_ERROR ERROR 7.4 起已知
trim 操作的参数或裁剪规格无效。 有效
2202E array_subscript_error ERRCODE_ARRAY_SUBSCRIPT_ERROR ERROR 7.4 起已知
数组下标或维度错误,如拼接维度不兼容。 有效
2202G invalid_tablesample_repeat ERRCODE_INVALID_TABLESAMPLE_REPEAT ERROR 9.5.0 起已知
TABLESAMPLE 的 REPEATABLE 种子不能为空。 有效
2202H invalid_tablesample_argument ERRCODE_INVALID_TABLESAMPLE_ARGUMENT ERROR 9.5.0 起已知
TABLESAMPLE 方法收到越界的采样参数。 有效
22030 duplicate_json_object_key_value ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE ERROR 12.0 起已知
构造 JSON 对象时出现重复键。 有效
22031 invalid_argument_for_sql_json_datetime_function ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION ERROR 13.0 起已知
SQL/JSON datetime 方法的参数或格式无效。 有效
22032 invalid_json_text ERRCODE_INVALID_JSON_TEXT ERROR 12.0 起已知
JSON 文本无效,无法被消费方解析。 有效
22033 invalid_sql_json_subscript ERRCODE_INVALID_SQL_JSON_SUBSCRIPT ERROR 12.0 起已知
SQL/JSON 数组下标无效,如越界或非数值。 有效
22034 more_than_one_sql_json_item ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM ERROR 12.0 起已知
SQL/JSON 结果多于一项,需要单项。 有效
22035 no_sql_json_item ERRCODE_NO_SQL_JSON_ITEM ERROR 12.0 起已知
指定 SQL/JSON path 没有找到任何项。 有效
22036 non_numeric_sql_json_item ERRCODE_NON_NUMERIC_SQL_JSON_ITEM ERROR 12.0 起已知
JSON 路径项方法收到非数值的项。 有效
22037 non_unique_keys_in_a_json_object ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT ERROR 12.0 起已知
JSON 对象中的键不唯一。 有效
22038 singleton_sql_json_item_required ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED ERROR 12.0 起已知
SQL/JSON 路径要求单一指定类型的结果。 有效
22039 sql_json_array_not_found ERRCODE_SQL_JSON_ARRAY_NOT_FOUND ERROR 12.0 起已知
JSON 路径访问器要求数组却收到非数组项。 有效
2203A sql_json_member_not_found ERRCODE_SQL_JSON_MEMBER_NOT_FOUND ERROR 12.0 起已知
JSON 对象成员不存在或当前项不是对象。 有效
2203B sql_json_number_not_found ERRCODE_SQL_JSON_NUMBER_NOT_FOUND ERROR 12.0 起已知
jsonpath 一元运算收到非数值的项。 有效
2203C sql_json_object_not_found ERRCODE_SQL_JSON_OBJECT_NOT_FOUND ERROR 12.0 起已知
JSON 路径访问器要求对象却收到非对象项。 有效
2203D too_many_json_array_elements ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS ERROR 12.0 起已知
JSON 数组元素数量过多。 有效
2203E too_many_json_object_members ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS ERROR 12.0 起已知
JSON 对象成员数量过多。 有效
2203F sql_json_scalar_required ERRCODE_SQL_JSON_SCALAR_REQUIRED ERROR 12.0 起已知
JSON_VALUE 要求标量,收到的项不是标量。 有效
2203G sql_json_item_cannot_be_cast_to_target_type ERRCODE_SQL_JSON_ITEM_CANNOT_BE_CAST_TO_TARGET_TYPE ERROR 15.0 起已知
SQL/JSON 项无法转换为目标类型。 有效
22P01 floating_point_exception ERRCODE_FLOATING_POINT_EXCEPTION ERROR 7.4 起已知
浮点异常,进程收到 SIGFPE 信号。 有效
22P02 invalid_text_representation ERRCODE_INVALID_TEXT_REPRESENTATION ERROR 7.4 起已知
文本无法解析为目标类型,如整数输入非法。 有效
22P03 invalid_binary_representation ERRCODE_INVALID_BINARY_REPRESENTATION ERROR 7.4 起已知
二进制数据格式无效,如 Bind 参数或二进制 COPY。 有效
22P04 bad_copy_file_format ERRCODE_BAD_COPY_FILE_FORMAT ERROR 7.4 起已知
COPY 文件结构错误,如字段数或头部不符。 有效
22P05 untranslatable_character ERRCODE_UNTRANSLATABLE_CHARACTER ERROR 7.4 起已知
字符在目标编码中没有对应表示。 有效
22P06 nonstandard_use_of_escape_character ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER ERROR 8.1.0 起已知
字符串字面量中反斜杠转义用法非标准。 有效
22P07 datum_version_mismatch ERRCODE_DATUM_VERSION_MISMATCH ERROR 14.25 起已知
复合类型数据与元组描述符的行类型版本不兼容。 有效