【问题标题】:How to insert values into decimal(65,0) and retrieve them from database using Golang?如何将值插入十进制(65,0)并使用 Golang 从数据库中检索它们?
【发布时间】:2018-07-26 09:54:56
【问题描述】:

我对 Go 比较陌生。 我正在使用 github.com/go-sql-driver/mysql 作为我的驱动程序 我有一个包含许多列的表,其数据类型为decimal(65,0)。 我正在尝试使用 big.Int 在我的应用程序中处理这些值,这对我来说似乎是合理的。 但是我找不到使用Stmt.Exec 将值插入数据库的方法。 它说

"sql: 转换参数 $2 类型:不支持的类型 big.Int,一个结构"

我也找不到将它从 mysql 序列化回我的 Go 结构的方法。

【问题讨论】:

  • 为什么您认为小数点前需要 65 位精度?
  • 我们在做区块链相关的逻辑。为了支持允许的最大数量,我们的技术主管决定使用小数(65)。

标签: mysql go


【解决方案1】:

对 SQL 语句使用字符串值。与*big.Int 值相互转换。例如,

package main

import (
    "fmt"
    "log"
    "math/big"

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

func printN(rows *sql.Rows) {
    for rows.Next() {
        var n *big.Int
        var s sql.NullString
        err := rows.Scan(&s)
        if err != nil {
            log.Print(err)
        }
        n, _ = new(big.Int).SetString(s.String, 10)
        fmt.Printf("n: %v\n", n.String())
    }
    err := rows.Err()
    if err != nil {
        log.Print(err)
    }
}

func main() {
    db, err := sql.Open("mysql", "peter:@/so")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    query := `SELECT n from so.dec65;`
    rows, err := db.Query(query)
    if err != nil {
        log.Fatal(err)
    }
    printN(rows)

    query = `SELECT n from so.dec65 WHERE n < ?;`
    arg1, ok := new(big.Int).SetString("12345678901234567891234567", 10)
    if ok {
        rows, err = db.Query(query, arg1.String())
        if err != nil {
            log.Fatal(err)
        }
        printN(rows)
    }
}

数据库:

mysql> DESCRIBE dec65;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| n     | decimal(65,0) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
mysql> SELECT n FROM dec65;
+-----------------------------+
| n                           |
+-----------------------------+
|  12345678901234567891234567 |
| -12345678901234567891234567 |
|                        NULL |

+-----------------------------+

输出:

n: 12345678901234567891234567
n: -12345678901234567891234567
n: <nil>
n: -12345678901234567891234567

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2016-06-15
    • 2016-09-06
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多