新增MySQL和pg数据库的同步
This commit is contained in:
@@ -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兼容大多数未明确映射的类型
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user