gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:43 27 4
gpt4 key购买 nike

我正在使用来自 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com