PostgreSQL中SQL Server迁移后压缩列的等效解压方法咨询
SQL Server压缩数据迁移至PostgreSQL后的解压方案
核心前提确认
SQL Server最常用的COMPRESS()函数生成的是GZIP格式的二进制数据,这是此类问题的典型场景。你遇到的JSON语法错误,本质是用了错误的解码方式(escape),没有正确处理压缩的二进制字节流。
GZIP压缩数据的正确解压语句
如果原数据是SQL Server COMPRESS()生成的,直接使用PostgreSQL的pg_decompress函数处理二进制数据:
SELECT convert_from(pg_decompress(sdata::bytea), 'UTF8')::jsonb FROM dbo.s_table;
原语句失败原因
decode(sdata, 'escape')是用于解码escape编码的字符串,而SQL Server的压缩结果是原生二进制字节流,并非escape编码文本。错误的解码逻辑会导致得到的内容不是合法的JSON原数据,进而触发语法错误。
其他场景的适配处理
数据经过Base64编码
若迁移前数据被Base64编码过,需先解码为bytea再解压:SELECT convert_from(pg_decompress(decode(sdata, 'base64')), 'UTF8')::jsonb FROM dbo.s_table;使用DEFLATE算法压缩
若原SQL Server采用DEFLATE而非GZIP压缩,改用zlib_decompress函数:SELECT convert_from(zlib_decompress(sdata::bytea), 'UTF8')::jsonb FROM dbo.s_table;字符编码不匹配
解压后出现乱码时,检查原SQL Server数据的字符编码(比如GBK),调整编码参数:SELECT convert_from(pg_decompress(sdata::bytea), 'GBK')::jsonb FROM dbo.s_table;
验证步骤
先单独查询解压后的文本内容,确认是否为合法JSON:
SELECT convert_from(pg_decompress(sdata::bytea), 'UTF8') FROM dbo.s_table LIMIT 1;
如果输出为乱码或非JSON格式,说明压缩方式判断错误,或数据迁移过程中存在损坏。
内容的提问来源于stack exchange,提问作者synccm2012
相关产品推荐
相关产品推荐

