1

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 コマンドを使用して [] バイト スライスから単に [4] バイト配列に変換したことに注意してください。ただし、次のエラーが発生します。

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

バイナリデータを送信するにはどうすればよいですか?

16 進数の文字列を使用すると、クエリは実行されますが、取得時に正しい値が得られません。

hex.EncodeToString() と "0x" + hex.EncodeToString() を試しましたが、どちらも正しく機能していません。

次に例を示します。

66.182.64.0 becomes 42b64000

MySQL 列に「42b64000」を保存すると、次のように返されます。

52 50 98 54

MySQL 列に「0x42b64000」を保存すると、次のように返されます。

48 120 52 50

これを修正するにはどうすればよいですか?

4

3 に答える 3

1

「42b64000」を MySQL 列に保存すると、次のように返されます。

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あり、それらの間で問題なくキャストできます (少しのメモリ コピーを除いて)。うまくいけば、My​​SQL ドライバーの引用符で文字列内の NUL を処理できます。

于 2013-11-10T08:13:25.950 に答える
0

あなたはそれをHEX文字列に変換する部分までです。

これが私がそれを解決した方法です(IPv4とIPv6の両方の場合):

  1. テーブルが次のとおりであるとします。

CREATE TABLE ip_addr (ip VARBINARY(16));

  1. INSERT または UPDATE ステートメントを次のように準備します。

stmt := db.Prepare("INSERT INTO ip_addr (ip) 値 (UNHEX(?))")

  1. 「Go」コードでは:
 if ip.To4() != nil {
                ip_hex = hex.EncodeToString(ip.To4())
 } else {
                ip_hex = hex.EncodeToString(ip.To16())
 }
 stmt.Exec(ip_hex)
于 2014-07-31T18:54:22.767 に答える