Golang MySQL插入数据时出现错误:"Incorrect string value: '\xC3'"

Golang MySQL插入数据时出现错误:“Incorrect string value: ‘\xC3’” 也许这里有人能帮我解决这个问题。我在 Stackoverflow 上提到了所有细节——请查看这里: https://stackoverflow.com/questions/63767694/go-mysql-insert-incorrect-string-value-xc3

到目前为止,我已经尝试了几种选项和解决方案,但我仍然遇到同样的问题。 我不确定这是否是 Go 的 bug?我毫无头绪。

如果能找到修复方法就太好了。 谢谢。


更多关于Golang MySQL插入数据时出现错误:"Incorrect string value: '\xC3'"的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang MySQL插入数据时出现错误:"Incorrect string value: '\xC3'"的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误通常是由于MySQL数据库的字符集配置不支持特定字符导致的。以下是解决方案:

1. 检查并修改数据库/表/列的字符集:

-- 查看当前字符集配置
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

-- 修改数据库字符集为utf8mb4
ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 修改表的字符集
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改特定列的字符集
ALTER TABLE your_table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 在Go连接字符串中指定字符集:

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

func main() {
    // 在DSN中添加charset=utf8mb4参数
    dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
    
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()
    
    // 设置连接参数
    db.SetConnMaxLifetime(time.Minute * 3)
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(10)
}

3. 确保MySQL服务器配置支持utf8mb4:

编辑MySQL配置文件(my.cnf或my.ini):

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

4. 插入数据时显式处理字符编码:

func insertData(db *sql.DB, data string) error {
    // 如果数据包含特殊字符,确保正确编码
    stmt, err := db.Prepare("INSERT INTO your_table (text_column) VALUES (?)")
    if err != nil {
        return err
    }
    defer stmt.Close()
    
    _, err = stmt.Exec(data)
    return err
}

5. 验证字符集问题的示例代码:

func testCharset(db *sql.DB) error {
    // 测试插入包含特殊字符的数据
    testStrings := []string{
        "正常文本",
        "特殊字符: café",
        "emoji: 😀",
        "欧洲字符: naïve",
    }
    
    for _, s := range testStrings {
        _, err := db.Exec("INSERT INTO test_table (content) VALUES (?)", s)
        if err != nil {
            return fmt.Errorf("插入失败 '%s': %v", s, err)
        }
    }
    return nil
}

执行上述修改后,重启MySQL服务并重新测试插入操作。错误’\xC3’通常表示尝试插入UTF-8字符到不支持该字符集的列中,使用utf8mb4字符集可以解决大多数Unicode字符的存储问题。

回到顶部