mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 16:30:25 +08:00 
			
		
		
		
	!122 fix: mysql导出修复
Merge pull request !122 from zongyangleo/dev_1.8.6_fix
This commit is contained in:
		@@ -2,6 +2,7 @@ package application
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"mayfly-go/internal/db/dbm/dbi"
 | 
			
		||||
	"mayfly-go/internal/db/domain/entity"
 | 
			
		||||
@@ -326,6 +327,8 @@ func (app *dbTransferAppImpl) transfer2Target(taskId uint64, targetConn *dbi.DbC
 | 
			
		||||
		columnNames = append(columnNames, targetMeta.QuoteIdentifier(col.ColumnName))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dataHelper := targetMeta.GetDataHelper()
 | 
			
		||||
 | 
			
		||||
	// 从目标库数据中取出源库字段对应的值
 | 
			
		||||
	values := make([][]any, 0)
 | 
			
		||||
	for _, record := range result {
 | 
			
		||||
@@ -342,6 +345,14 @@ func (app *dbTransferAppImpl) transfer2Target(taskId uint64, targetConn *dbi.DbC
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if dataHelper.GetDataType(string(tc.DataType)) == dbi.DataTypeBlob {
 | 
			
		||||
				decodeBytes, err := hex.DecodeString(val.(string))
 | 
			
		||||
				if err == nil {
 | 
			
		||||
					val = decodeBytes
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			rawValue = append(rawValue, val)
 | 
			
		||||
		}
 | 
			
		||||
		values = append(values, rawValue)
 | 
			
		||||
 
 | 
			
		||||
@@ -214,6 +214,9 @@ func valueConvert(data []byte, colType *sql.ColumnType) any {
 | 
			
		||||
	if strings.Contains(colDatabaseTypeName, "bit") {
 | 
			
		||||
		return data[0]
 | 
			
		||||
	}
 | 
			
		||||
	if colDatabaseTypeName == "blob" {
 | 
			
		||||
		return fmt.Sprintf("%x", data)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 这里把[]byte数据转成string
 | 
			
		||||
	stringV := string(data)
 | 
			
		||||
 
 | 
			
		||||
@@ -84,6 +84,13 @@ type Column struct {
 | 
			
		||||
 | 
			
		||||
// 拼接数据类型与长度等。如varchar(2000),decimal(20,2)
 | 
			
		||||
func (c *Column) GetColumnType() string {
 | 
			
		||||
	// 哪些mysql数据类型不需要添加字段长度
 | 
			
		||||
	if collx.ArrayAnyMatches([]string{"int", "blob", "float", "double", "date", "year", "json"}, string(c.DataType)) {
 | 
			
		||||
		return string(c.DataType)
 | 
			
		||||
	}
 | 
			
		||||
	if c.DataType == "timestamp" {
 | 
			
		||||
		return "timestamp(6)"
 | 
			
		||||
	}
 | 
			
		||||
	if c.CharMaxLength > 0 {
 | 
			
		||||
		return fmt.Sprintf("%s(%d)", c.DataType, c.CharMaxLength)
 | 
			
		||||
	}
 | 
			
		||||
@@ -124,6 +131,7 @@ const (
 | 
			
		||||
	CommonTypeVarbinary  ColumnDataType = "varbinary"
 | 
			
		||||
 | 
			
		||||
	CommonTypeInt      ColumnDataType = "int"
 | 
			
		||||
	CommonTypeBit      ColumnDataType = "bit"
 | 
			
		||||
	CommonTypeSmallint ColumnDataType = "smallint"
 | 
			
		||||
	CommonTypeTinyint  ColumnDataType = "tinyint"
 | 
			
		||||
	CommonTypeNumber   ColumnDataType = "number"
 | 
			
		||||
@@ -146,6 +154,7 @@ const (
 | 
			
		||||
	DataTypeDate     DataType = "date"
 | 
			
		||||
	DataTypeTime     DataType = "time"
 | 
			
		||||
	DataTypeDateTime DataType = "datetime"
 | 
			
		||||
	DataTypeBlob     DataType = "blob"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 列数据处理帮助方法
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,8 @@ var (
 | 
			
		||||
	// 时间类型
 | 
			
		||||
	timeRegexp = regexp.MustCompile(`(?i)time`)
 | 
			
		||||
 | 
			
		||||
	blobRegexp = regexp.MustCompile(`(?i)blob`)
 | 
			
		||||
 | 
			
		||||
	//  mysql数据类型 映射 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"bigint":     dbi.CommonTypeBigint,
 | 
			
		||||
@@ -37,6 +39,7 @@ var (
 | 
			
		||||
		"longtext":   dbi.CommonTypeLongtext,
 | 
			
		||||
		"mediumblob": dbi.CommonTypeBlob,
 | 
			
		||||
		"mediumtext": dbi.CommonTypeText,
 | 
			
		||||
		"bit":        dbi.CommonTypeBit,
 | 
			
		||||
		"set":        dbi.CommonTypeVarchar,
 | 
			
		||||
		"smallint":   dbi.CommonTypeSmallint,
 | 
			
		||||
		"text":       dbi.CommonTypeText,
 | 
			
		||||
@@ -60,6 +63,7 @@ var (
 | 
			
		||||
		dbi.CommonTypeMediumtext: "text",
 | 
			
		||||
		dbi.CommonTypeVarbinary:  "varbinary",
 | 
			
		||||
		dbi.CommonTypeInt:        "int",
 | 
			
		||||
		dbi.CommonTypeBit:        "bit",
 | 
			
		||||
		dbi.CommonTypeSmallint:   "smallint",
 | 
			
		||||
		dbi.CommonTypeTinyint:    "tinyint",
 | 
			
		||||
		dbi.CommonTypeNumber:     "decimal",
 | 
			
		||||
@@ -92,6 +96,10 @@ func (dc *DataHelper) GetDataType(dbColumnType string) dbi.DataType {
 | 
			
		||||
	if timeRegexp.MatchString(dbColumnType) {
 | 
			
		||||
		return dbi.DataTypeTime
 | 
			
		||||
	}
 | 
			
		||||
	// blob类型
 | 
			
		||||
	if blobRegexp.MatchString(dbColumnType) {
 | 
			
		||||
		return dbi.DataTypeBlob
 | 
			
		||||
	}
 | 
			
		||||
	return dbi.DataTypeString
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -157,6 +165,8 @@ func (dc *DataHelper) WrapValue(dbColumnValue any, dataType dbi.DataType) string
 | 
			
		||||
	case dbi.DataTypeDate, dbi.DataTypeDateTime, dbi.DataTypeTime:
 | 
			
		||||
		// mysql时间类型无需格式化
 | 
			
		||||
		return fmt.Sprintf("'%s'", dbColumnValue)
 | 
			
		||||
	case dbi.DataTypeBlob:
 | 
			
		||||
		return fmt.Sprintf("unhex('%s')", dbColumnValue)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("'%s'", dbColumnValue)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user