插入长文本报LOB数据复制长度超配置最大值的库间差异问题
两个数据库超长文本插入行为差异的根本原因
两个库的行为差异是复制功能开启状态、ANSI_WARNINGS配置、TEXTSIZE配置三个维度的差异共同导致的,具体逻辑如下:
- 首先
max text repl size参数的限制仅对开启了事务复制/合并复制的数据库生效,未配置任何复制发布、订阅的数据库不会触发该校验规则,这是两个库行为分歧的核心前提。你观察到报错的数据库必然已经开启了复制功能,自动截断的数据库未开启复制。 - 未开启复制的数据库,超长文本的处理逻辑由另外两个配置控制:
- 全局/会话级
TEXTSIZE配置默认值为65536,用于限制单次返回/插入的文本类数据最大长度 - 如果数据库级
ANSI_WARNINGS配置为OFF,插入数据超过TEXTSIZE或字段本身最大长度时,数据库会自动截断超出部分,不会抛出报错,这就是你观察到长度被限制为65536的原因。
- 全局/会话级
- 开启了复制的数据库,复制场景的LOB长度校验优先级高于普通的截断逻辑:只要插入的LOB类数据(text、ntext、varchar(max)、nvarchar(max)、varbinary(max)等)长度超过
max text repl size的默认值65535,就会直接抛出Length of LOB data to be replicated exceeds configured maximum错误,不会触发自动截断逻辑。
配置验证方法
你可以执行以下SQL确认两个库的配置差异:
- 检查复制功能开启状态
SELECT name, is_published, is_merge_published FROM sys.databases WHERE name IN ('[报错库名称]', '[自动截断库名称]')
返回值为1代表对应复制功能已开启。
2. 检查数据库级ANSI_WARNINGS配置
SELECT name, is_ansi_warnings_on FROM sys.databases WHERE name IN ('[报错库名称]', '[自动截断库名称]')
- 检查全局
max text repl size配置
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'max text repl size';
- 检查会话
TEXTSIZE配置
SELECT @@TEXTSIZE;
内容的提问来源于stack exchange,提问作者Lloyd95
相关产品推荐
相关产品推荐

