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

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

    }

请注意,我使用 copy 命令将 []byte 切片转换为简单的 [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

我该如何解决?


慕田峪4524236
浏览 428回答 3
3回答

收到一只叮咚

您可以尝试使用encoding/binary:binary.LittleEndian.Uint32(net.ParseIP(rangeStart).To4()) 和将其存储为 uint32 binary.LittleEndian.PutUint32(destinationSlice, colValue)。如果LittleEndian为您的其他应用程序提供错误的结果,请BigEndian改用。

天涯尽头无女友

您完全可以将其转换为十六进制字符串。这是我解决它的方法(对于 IPv4 和 IPv6):假设您的表是:创建表 ip_addr (ip VARBINARY(16));准备 INSERT 或 UPDATE 语句如下:stmt := db.Prepare("INSERT INTO ip_addr (ip) VALUES (UNHEX(?))")在“Go”代码中: if ip.To4() != nil {                 ip_hex = hex.EncodeToString(ip.To4())  } else {                 ip_hex = hex.EncodeToString(ip.To16())  }  stmt.Exec(ip_hex)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go