#mysql #bit
#mysql #бит
Вопрос:
У меня есть этот запрос
UPDATE myTable SET f='MYVALUE' WHERE id=1
В котором я могу ТОЛЬКО изменить MYVALUE, ничего больше.
Теперь, если f
есть какой-либо из этих типов:
INT
SMALLINT
MEDIUMINT
BIGINT
TINYTEXT
TEXT
MEDIUMTEXT
BIGTEXT
ENUM('0','1')
SET('0','1')
TIME
YEAR
и мне наскучило их писать, но… Вы поняли суть: ЛЮБОЙ ТИП, он работает.
Если f
имеет тип BIT
, независимо от того, сколько бит, то нет, это мне не позволяет. Я надеялся, что смогу выполнить одно из следующих действий:
- Задайте непосредственно двоичное число
f='10111'
: нет. - Установите десятичное значение, надеясь, что оно преобразует его
f='23'
: нет. - Задайте шестнадцатеричное значение, надеясь, что оно его преобразует
f='0x23'
: нет. - Используйте правильный синтаксис (хотя и с неправильными кавычками)
f='b'10111''
: нет. - Экранирование кавычек
f='b'10111''
: нет. - Дублирование кавычек
f='b''10111'''
: нет.
Да, я знаю, я мог бы просто написать f=b'10111'
, но, как уже было сказано, я не могу удалить эти кавычки. Я могу изменить только этот параметр «значение».
Есть ли обходной путь? На самом деле это работает с любыми типами… КРОМЕ битов!!!
Для пояснения: похоже, что я могу использовать только функцию с именем setValue (значение), и у меня нет контроля над содержимым. Допустим, PHP
function setValue($v) {
$sql = "UPDATE myTable SET f='$v' WHERE id=1";
// execute $sql
}
Комментарии:
1. как всегда, используйте int в нужном вам размере и используйте преобразование битов в int, чтобы сэкономить 3 it 11000000
2. Учитывая жесткие ограничения, с которыми вы, по-видимому, работаете, я не понимаю, как вы можете вводить значения битов.
Ответ №1:
Используйте параметры запроса.
Вот демонстрация с использованием подготовленных инструкций текстового протокола MySQL, но это будет работать с подготовленными инструкциями на любом языке программирования.
mysql> set @b = b'101';
Query OK, 0 rows affected (0.00 sec)
mysql> prepare s from 'update mytable set f = ? where id = 1';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute s using @b;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id, bin(f) from mytable;
---- --------
| id | bin(f) |
---- --------
| 1 | 101 |
---- --------
Комментарии:
1. Спасибо, это то, чего я не знал. К сожалению, это не решает мою проблему. Я могу указать только параметр MYVALUE, и запрос не может быть изменен, и я не могу отправлять другие команды. Я ищу, «что поместить внутрь» кавычек, чтобы его можно было проанализировать как двоичный. И если это невозможно сделать, ну, хорошо, но … 🙂
2. Вам придется использовать символы, кодировка которых совпадает с битами, которые вы хотите ввести. Это будет очень сложно, и это все равно не сработает для любого произвольного значения, потому что не каждый битовый шаблон, который вы, возможно, захотите ввести, даже соответствует символу в наборе символов клиента. В принципе, вам нужно было бы стать экспертом по наборам символов.