You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中rows.Scan处理数据库NULL值报错的解决方案咨询

解决Golang数据库Scan时NULL字符串字段的报错问题

你的代码报错是因为Go原生string类型无法存储NULL值,当数据库返回NULL的MIDDLE_NAME字段时,直接扫描到*string指针会触发类型转换错误。下面提供两种可行的解决方式:

方式一:使用sql.NullString(推荐)

标准库database/sql中的sql.NullString结构体专门用来处理这类场景,它包含String(实际字符串值)和Valid(标记是否为NULL)两个字段。修改printRows函数如下:

func printRows(rows *sql.Rows) {
    cols, _ := rows.Columns()
    for rows.Next() {
        // 把string切片替换为sql.NullString切片
        columns := make([]sql.NullString, len(cols))
        columnPointers := make([]interface{}, len(cols))
        for i := range columns {
            columnPointers[i] = &columns[i]
        }

        err := rows.Scan(columnPointers...)
        if err != nil {
            panic(err)
        }
        var sb strings.Builder
        sb.WriteString("|")
        for _, ns := range columns {
            // 判断是否为NULL,是则输出空字符串,否则输出实际值
            if ns.Valid {
                sb.WriteString(ns.String)
            }
            sb.WriteString("|")
        }
        log.Println(sb.String())
    }
}

关键修改点:

  • 将存储字段值的切片从[]string改为[]sql.NullString
  • 扫描时直接传入sql.NullString的指针,rows.Scan会自动填充String和Valid字段
  • 输出时通过Valid字段判断是否为NULL,灵活处理显示逻辑

方式二:使用*string指针

如果不想引入sql.NullString,也可以用*string类型来接收值,NULL会被扫描为nil指针:

func printRows(rows *sql.Rows) {
    cols, _ := rows.Columns()
    for rows.Next() {
        // 初始化*string切片,每个元素默认是nil
        columns := make([]*string, len(cols))
        columnPointers := make([]interface{}, len(cols))
        for i := range columns {
            columnPointers[i] = &columns[i]
        }

        err := rows.Scan(columnPointers...)
        if err != nil {
            panic(err)
        }
        var sb strings.Builder
        sb.WriteString("|")
        for _, sPtr := range columns {
            // 判断指针是否为nil(即数据库返回NULL)
            if sPtr != nil {
                sb.WriteString(*sPtr)
            }
            sb.WriteString("|")
        }
        log.Println(sb.String())
    }
}

这种方式需要注意:空字符串和NULL在指针表现上不同(空字符串是指向""的指针,NULL是nil),如果业务不需要区分两者,用这种方式也可以。

内容的提问来源于stack exchange,提问作者John Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:25:18