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触发字符值错误
原因
- 字符集不匹配:PostgreSQL默认使用
UTF8,而MySQL的LongText列可能采用latin1等非UTF8字符集,导致部分字符无法存储。 - SymmetricDS将PostgreSQL的Text列以二进制流形式同步,被MySQL识别为非法字符。
解决方案
统一连接编码配置
- 修改SymmetricDS的MySQL连接参数,添加
characterEncoding=utf8mb4,确保以UTF8编码读写数据。 - 修改SymmetricDS的PostgreSQL连接参数,添加
client_encoding=UTF8,保证读取数据时的编码一致性。
- 修改SymmetricDS的MySQL连接参数,添加
添加反向列转换规则
配置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() );
- 修正触发器列类型标记
将触发器中对应列的类型从默认的BINARY改为STRING:
UPDATE trigger_column SET data_type='STRING' WHERE trigger_id='your_trigger_id' AND column_name='foo';
验证流程
- 重启SymmetricDS节点,确保配置生效。
- 在MySQL插入含LongText的测试数据,检查PostgreSQL对应列是否为明文。
- 在PostgreSQL更新该Text列,确认MySQL同步成功且无编码错误。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

