首页 > 解决方案 > MySQL BIT 类型 SET 使用引号

问题描述

我有这个查询

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是 type 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(value) 的函数,而我无法控制内容。比方说 PHP

function setValue($v) {
  $sql = "UPDATE myTable SET f='$v' WHERE id=1"; 
  // execute $sql
}

标签: mysqlbit

解决方案


使用查询参数。

这是一个使用 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    |
+----+--------+

推荐阅读