新增MySQL和pg数据库的同步

This commit is contained in:
2025-08-27 13:02:24 +08:00
parent 416924f80e
commit 7a05d892ce

View File

@@ -193,18 +193,65 @@ public class taskDbSync {
* MySQL到PostgresSQL数据类型映射
*/
private String mapMySqlTypeToPgType(String mySqlType, int columnSize, int decimalDigits) {
return switch (mySqlType) {
// 统一转为大写处理,避免类型字符串大小写问题
String type = mySqlType.toUpperCase();
return switch (type) {
// 整数类型映射
case "INT", "INTEGER" -> "INTEGER";
case "TINYINT" -> columnSize == 1 ? "BOOLEAN" : "SMALLINT"; // TINYINT(1)通常表示布尔值
case "SMALLINT" -> "SMALLINT";
case "MEDIUMINT" -> "INTEGER"; // PostgresSQL无MEDIUMINT用INTEGER兼容
case "BIGINT" -> "BIGINT";
case "VARCHAR", "CHAR" -> "VARCHAR(" + columnSize + ")";
case "TEXT" -> "TEXT";
// 浮点类型映射
case "FLOAT" -> columnSize > 24 ? "DOUBLE PRECISION" : "REAL"; // FLOAT(24)以下映射为REAL
case "DOUBLE", "DOUBLE PRECISION" -> "DOUBLE PRECISION";
case "DECIMAL", "NUMERIC" -> {
int precision = columnSize > 0 ? columnSize : 10;
int scale = Math.max(decimalDigits, 0);
yield "NUMERIC(" + precision + "," + scale + ")";
}
// 字符串类型映射
case "VARCHAR" -> {
// PostgresSQL VARCHAR无长度限制时建议用TEXT
int length = Math.max(columnSize, 0);
yield length > 0 ? "VARCHAR(" + length + ")" : "TEXT";
}
case "CHAR" -> "CHAR(" + (columnSize > 0 ? columnSize : 1) + ")";
case "TEXT", "MEDIUMTEXT", "TINYTEXT" -> "TEXT";
case "LONGTEXT" -> "TEXT"; // PostgresSQL TEXT无长度限制
// 二进制类型映射
case "BLOB" -> "BYTEA";
case "TINYBLOB", "MEDIUMBLOB", "LONGBLOB" -> "BYTEA";
case "BINARY" -> "BYTEA";
case "VARBINARY" -> "BYTEA";
// 日期时间类型映射
case "DATE" -> "DATE";
case "TIME" -> "TIME";
case "DATETIME", "TIMESTAMP" -> "TIMESTAMP";
case "FLOAT", "DOUBLE" -> "DOUBLE PRECISION";
case "DECIMAL", "NUMERIC" -> "NUMERIC(" + columnSize + "," + decimalDigits + ")";
case "YEAR" -> "SMALLINT"; // YEAR用SMALLINT存储更高效
// 特殊类型映射
case "BOOLEAN" -> "BOOLEAN";
case "TINYINT" -> columnSize == 1 ? "BOOLEAN" : "SMALLINT";
default -> "VARCHAR(" + (columnSize > 0 ? columnSize : 255) + ")";
case "JSON", "JSONB" -> "JSONB"; // PostgresSQL推荐用JSONB
case "ENUM" -> "VARCHAR(255)"; // ENUM转为字符串存储需业务层保证合法性
case "SET" -> "TEXT"; // SET用TEXT存储逗号分隔
// 几何类型(简化映射)
case "POINT" -> "POINT";
case "LINESTRING" -> "LINESTRING";
case "POLYGON" -> "POLYGON";
// 未匹配类型的默认处理
default -> {
// 日志输出未匹配的类型,便于后续优化
System.err.println("未处理的MySQL类型: " + mySqlType);
yield "TEXT"; // 用TEXT兼容大多数未明确映射的类型
}
};
}