From 7a05d892cead0454c66c9c9ff1c0444e3eefc209 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Wed, 27 Aug 2025 13:02:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EMySQL=E5=92=8Cpg=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=9A=84=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mini/capi/job/taskDbSync.java | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/mini/capi/job/taskDbSync.java b/src/main/java/com/mini/capi/job/taskDbSync.java index 4281d4a..7ab272e 100644 --- a/src/main/java/com/mini/capi/job/taskDbSync.java +++ b/src/main/java/com/mini/capi/job/taskDbSync.java @@ -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兼容大多数未明确映射的类型 + } }; }