发现 Golang MySQL 下,MySQL 驱动默认把 interface{} 类型解析为 []byte,导致字符串和数字以 Base64 编码形式返回。
测试代码如下,

package main

import (
	"context"
	"database/sql"
	"fmt"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	dsn := "root:secret@tcp(localhost:3306)/?charset=utf8mb4&parseTime=true"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}

	ctx := context.Background()
	rows1, err := db.QueryContext(ctx, "select 100 as a, 'aaa' as b, now() as t")
	if err != nil {
		panic(err)
	}
	defer rows1.Close()

	var a1 int64
	var b1 string
	var t1 time.Time
	for rows1.Next() {
		rows1.Scan(&a1, &b1, &t1)
	}
	fmt.Println(a1, b1, t1) // 100 aaa 2025-03-10 08:48:39 +0000 UTC

	rows2, err := db.QueryContext(ctx, "select 100 as a, 'aaa' as b, now() as t")
	if err != nil {
		panic(err)
	}
	defer rows2.Close()

	var a2 interface{}
	var b2 interface{}
	var t2 interface{}
	for rows2.Next() {
		rows2.Scan(&a2, &b2, &t2)
	}
	fmt.Println(a2, b2, t2) // [49 48 48] [97 97 97] 2025-03-10 08:50:25 +0000 UTC
	if aBytes, ok := a2.([]byte); ok {
		fmt.Println("===> string(aBytes) ", string(aBytes)) // ===> string(aBytes)  100
	}
	if bBytes, ok := b2.([]byte); ok {
		fmt.Println("===> string(bBytes) ", string(bBytes)) // ===> string(bBytes)  aaa
	}
}