Я пытаюсь сохранить строку в двоичном формате, чтобы сэкономить место в моей базе данных MySQL. Однако я не могу правильно получить двоичные данные, так что я делаю не так?
У меня есть база данных, как:
CREATE TABLE `Test` (
ID INT NOT,
Value BLOB
);
Я вставляю данные с такими утверждениями, как:
INSERT INTO `Test` (ID, Value) VALUES(1, b'10000001');
Однако я не могу получить двоичную строку, когда выбираю значение из вставленной строки с помощью нижнего запроса:
SELECT * FROM `Test`; //NOT WORKING. Returns Value=0
SELECT ID, BIN(Value) FROM `Test`; //NOT WORKING. Returns Value=0
Что я должен использовать? Я уже пытался использовать BIN(Value)
в моем запросе, как показано выше, но безуспешно. Заранее спасибо.
Начинать с буквальной строки единиц и нулей невероятно странно, но:
$ones_and_zeroes = '10000001';
// If you have a literal string of ones and zeroes that you need to convert
// to an actual number there's base_convert()
$hex_string = base_convert($ones_and_zeroes, 2, 16);
// $hex_string is now "81"
// you can convert this to an *actual* binary string with hex2bin()
$bin = hex2bin($hex_string);
// $bin now contains the byte 0x81
// now if you want to do it right:
$dbh = new PDO( ... );
$stmt = $dbh->prepare('INSERT INTO `Test` (ID, Value) VALUES(1, :bin)');
$stmt->execute(['bin'=>$bin]);
// or whatever the gross mysqli equivalent is.
Я не собираюсь показывать вам, как это сделать неправильно в PHP, но вы хотели написать этот запрос от руки:
INSERT INTO `Test` (ID, Value) VALUES(1, 0x81);
Данные в шестнадцатеричном формате с префиксом «0x» являются единственным безопасным способом [который мне известен] для встраивания двоичных данных в текстовый запрос, хотя СУЩЕСТВЕННО предпочтительнее использовать подготовленные операторы, когда это возможно, так как данные шестнадцатеричного кодирования, подобные этому, удваивают длина.
Лучший совет — проверить, успешно ли выполнен запрос вставки, то есть ожидаемые данные вставлены в БД, используя любой инструмент администрирования MySQL.
Только тогда вы сможете определить, связана ли проблема с поиском или с самими вставками.