Набор типов битов MySQL с использованием кавычек

#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 , независимо от того, сколько бит, то нет, это мне не позволяет. Я надеялся, что смогу выполнить одно из следующих действий:

  1. Задайте непосредственно двоичное число f='10111' : нет.
  2. Установите десятичное значение, надеясь, что оно преобразует его f='23' : нет.
  3. Задайте шестнадцатеричное значение, надеясь, что оно его преобразует f='0x23' : нет.
  4. Используйте правильный синтаксис (хотя и с неправильными кавычками) f='b'10111'' : нет.
  5. Экранирование кавычек f='b'10111'' : нет.
  6. Дублирование кавычек 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. Вам придется использовать символы, кодировка которых совпадает с битами, которые вы хотите ввести. Это будет очень сложно, и это все равно не сработает для любого произвольного значения, потому что не каждый битовый шаблон, который вы, возможно, захотите ввести, даже соответствует символу в наборе символов клиента. В принципе, вам нужно было бы стать экспертом по наборам символов.