2013-11-10 2 views
0

Я использую драйвер MySQL из http://github.com/go-sql-driver/mysqlGo/GoLang хранения двоичных данных в MySQL

Мне нужно хранить бинарное представление IP-адреса в MySQL в (4) колонке BINARY.

Чтобы сделать это, я попытался:

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) 
    } 

Обратите внимание, что я использовал команду копирования для преобразования из [] байт ломтика просто [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 

Как отправить бинарный файл данные?

EDIT

Хорошо, если я использую шестнадцатеричную строку, он будет выполнять запрос, но я не получаю правильные значения при извлечении.

Я пробовал hex.EncodeToString() и «0x» + hex.EncodeToString(), и ни один из них не работает должным образом.

Вот пример:

66.182.64.0 becomes 42b64000 

Если я храню "42b64000" в моем колонке MySQL, я получаю обратно:

52 50 98 54 

Если я храню "0x42b64000" в моем колонке MySQL, я получаю назад:

48 120 52 50 

Как исправить это?

ответ

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, и вы можете создавать между ними без проблем (кроме бит копирования памяти). Надеюсь, цитирование в драйвере MySQL может касаться NUL в строке.

0

Вы пытались бы сохранить его в качестве uint32 с помощью encoding/binary: binary.LittleEndian.Uint32(net.ParseIP(rangeStart).To4()) и binary.LittleEndian.PutUint32(destinationSlice, colValue). Если LittleEndian дает неправильные результаты для других применений, вместо этого используйте BigEndian.

0

Вы прямо перед частью преобразования его в строку HEX.

Вот как я решил ее (как для IPv4 и IPv6):

  1. Предположим, что ваша таблица:

CREATE TABLE ip_addr (ip VARBINARY(16));

  1. Подготовьте INSERT или UPDATE заявление следующим образом:

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

  1. В коде 'Go':
if ip.To4() != nil { 
       ip_hex = hex.EncodeToString(ip.To4()) 
} else { 
       ip_hex = hex.EncodeToString(ip.To16()) 
} 
stmt.Exec(ip_hex) 
Смежные вопросы