You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SymmetricDS中MySQL LongText与PostgreSQL Text双向同步异常排查

解决SymmetricDS双向同步MySQL LongText与PostgreSQL Text的明文存储及编码问题

问题1:MySQL LongText同步至PostgreSQL变为十六进制

原因

SymmetricDS默认将MySQL的LONGTEXT列识别为二进制类型(类似BLOB),同步时自动转为十六进制字符串存储,而非明文文本。

解决方案

添加列转换规则,强制将MySQL端的LongText按字符串类型处理:

INSERT INTO column_transform (
    transform_id, source_table_name, source_column_name,
    target_table_name, target_column_name, transform_type,
    transform_expression, create_time, last_update_time
) VALUES (
    'mysql_longtext_to_pg_text', 'your_target_table', 'foo',
    'your_target_table', 'foo', 'copy',
    'CAST(:SOURCE_COLUMN AS CHAR)', NOW(), NOW()
);
  • 若需全局适配所有LongText列,可将source_table_name设为*、source_column_name设为*,建议优先针对具体表配置以避免影响其他列。

问题2:PostgreSQL更新同步回MySQL触发字符值错误

原因

  1. 字符集不匹配:PostgreSQL默认使用UTF8,而MySQL的LongText列可能采用latin1等非UTF8字符集,导致部分字符无法存储。
  2. SymmetricDS将PostgreSQL的Text列以二进制流形式同步,被MySQL识别为非法字符。

解决方案

  1. 统一连接编码配置

    • 修改SymmetricDS的MySQL连接参数,添加characterEncoding=utf8mb4,确保以UTF8编码读写数据。
    • 修改SymmetricDS的PostgreSQL连接参数,添加client_encoding=UTF8,保证读取数据时的编码一致性。
  2. 添加反向列转换规则
    配置PostgreSQL Text到MySQL LongText的字符串转换:

INSERT INTO column_transform (
    transform_id, source_table_name, source_column_name,
    target_table_name, target_column_name, transform_type,
    transform_expression, create_time, last_update_time
) VALUES (
    'pg_text_to_mysql_longtext', 'your_target_table', 'foo',
    'your_target_table', 'foo', 'copy',
    'CAST(:SOURCE_COLUMN AS VARCHAR)', NOW(), NOW()
);
  1. 修正触发器列类型标记
    将触发器中对应列的类型从默认的BINARY改为STRING:
UPDATE trigger_column SET data_type='STRING' 
WHERE trigger_id='your_trigger_id' AND column_name='foo';

验证流程

  1. 重启SymmetricDS节点,确保配置生效。
  2. 在MySQL插入含LongText的测试数据,检查PostgreSQL对应列是否为明文。
  3. 在PostgreSQL更新该Text列,确认MySQL同步成功且无编码错误。

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:00:02