mysql - 如何在 MySQL 中存储二进制数据?

标签 mysql go

我正在使用来自 http://github.com/go-sql-driver/mysql 的 MySQL 驱动程序

我需要将 MySQL 中 IP 地址的二进制表示形式存储在 BINARY(4) 列中。

为此,我尝试过:

    startSlice := net.ParseIP(rangeStart).To4()
    var startBytes [4]byte
    copy(startSlice[:], startBytes[0:4])

    endSlice := net.ParseIP(rangeEnd).To4()
    var endBytes [4]byte
    copy(endSlice[:], endBytes[0:4])

    r, e := db.Exec("UPDATE AIPRangesBlocks SET BinRangeStart = ?, BinRangeEnd = ? WHERE IPGRID = ?", startBytes, endBytes, id)
    fmt.Println("result of update:", r)
    if e != nil {
        fmt.Println(e)
    }

请注意,我使用复制命令将 []byte slice 转换为简单的 [4]byte 数组,但出现此错误:

sql: converting Exec argument #0's type: unsupported type [4]uint8, a array

如果我直接使用 net.ParseIP("some_ip").To4(),我会收到这个错误:

sql: converting Exec argument #0's type: unsupported type net.IP, a slice

如何发送二进制数据?

如果我使用十六进制字符串,它会执行查询,但我无法在检索时获得正确的值。

我尝试了 hex.EncodeToString() 和 "0x"+ hex.EncodeToString(),但都无法正常工作。

这是一个例子:

66.182.64.0 becomes 42b64000

如果我在我的 MySQL 列中存储“42b64000”,我会返回:

52 50 98 54

如果我在我的 MySQL 列中存储“0x42b64000”,我会返回:

48 120 52 50

我该如何解决这个问题?

最佳答案

如果您在我的 MySQL 列中存储“42b64000”,您会返回:

52 50 98 54

解码成 ASCII 这是你给它的字符串的开始,例如

"42b6"

这表明将 IP 地址片作为字符串传递是可行的,例如

startSlice := net.ParseIP(rangeStart).To4()
endSlice := net.ParseIP(rangeEnd).To4()
r, e := db.Exec("UPDATE AIPRangesBlocks SET BinRangeStart = ?, BinRangeEnd = ? WHERE IPGRID = ?", string(startSlice), string(endSlice), id)
fmt.Println("result of update:", r)
if e != nil {
    fmt.Println(e)
}

在 go 中,字符串本质上是 []byte 的只读版本,您可以毫无问题地在它们之间进行转换(除了一些内存复制)。希望 MySQL 驱动程序中的引用可以处理字符串中的 NUL。

关于mysql - 如何在 MySQL 中存储二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886919/

相关文章:

Mysql 维护 Stock 的颜色和尺寸

mysql - 最高连续出现次数的总和

java - 使用单个 "update"JButton 将测试表的 auto_increment 值插入到分数表表中

go - 我可以使用 Context().Done() 来检查服务器关闭吗?

xml - Go XML chardata 打印空行

http - golang静态服务器总是返回404页面未找到

mysql - 如何设置数据库表、数据库设计

javascript - 根据输入数据,如果条件为真,则显示按钮

go - 使用 cron 运行 Go 方法

go - 使用redis作为缓存,TTL和Mysql中每个表的字节大小限制