From a39dc337708aa6d33b708372c57bf1eb99c0daea Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:21:21 +0800 Subject: [PATCH] fix: Handle empty character set in MariaDB compatibility (#11082) --- agent/utils/mysql/client/info.go | 5 +++-- agent/utils/mysql/client/local.go | 3 +++ agent/utils/mysql/client/remote.go | 9 ++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/agent/utils/mysql/client/info.go b/agent/utils/mysql/client/info.go index 5b6ffb6f0..7fc704146 100644 --- a/agent/utils/mysql/client/info.go +++ b/agent/utils/mysql/client/info.go @@ -3,6 +3,7 @@ package client import ( "crypto/tls" "crypto/x509" + "database/sql" "errors" "github.com/1Panel-dev/1Panel/agent/global" @@ -82,8 +83,8 @@ type BackupInfo struct { } type FormatCollation struct { - Format string `json:"format" gorm:"column:CHARACTER_SET_NAME"` - Collation string `json:"collation" gorm:"column:COLLATION_NAME"` + Format sql.NullString `json:"format" gorm:"column:CHARACTER_SET_NAME"` + Collation sql.NullString `json:"collation" gorm:"column:COLLATION_NAME"` } type RecoverInfo struct { diff --git a/agent/utils/mysql/client/local.go b/agent/utils/mysql/client/local.go index ce0caaa90..8cf08a494 100644 --- a/agent/utils/mysql/client/local.go +++ b/agent/utils/mysql/client/local.go @@ -405,6 +405,9 @@ func (r *Local) LoadFormatCollation(timeout uint) ([]dto.MysqlFormatCollationOpt if len(parts) != 2 { continue } + if parts[0] == "NULL" { + continue + } if _, ok := formatMap[parts[0]]; !ok { formatMap[parts[0]] = []string{parts[1]} } else { diff --git a/agent/utils/mysql/client/remote.go b/agent/utils/mysql/client/remote.go index 86ebc980a..64ce20d1c 100644 --- a/agent/utils/mysql/client/remote.go +++ b/agent/utils/mysql/client/remote.go @@ -421,10 +421,13 @@ func (r *Remote) LoadFormatCollation(timeout uint) ([]dto.MysqlFormatCollationOp if err := rows.Scan(&item.Format, &item.Collation); err != nil { return nil, err } - if _, ok := formatMap[item.Format]; !ok { - formatMap[item.Format] = []string{item.Collation} + if !item.Format.Valid { + continue + } + if _, ok := formatMap[item.Format.String]; !ok { + formatMap[item.Format.String] = []string{item.Collation.String} } else { - formatMap[item.Format] = append(formatMap[item.Format], item.Collation) + formatMap[item.Format.String] = append(formatMap[item.Format.String], item.Collation.String) } } options := []dto.MysqlFormatCollationOption{}