3

我正在研究数据压缩,出于某种原因,我只需要 8 位。我正在通过 decbin() 转换数字,然后将其插入到 mysql 中,mysql 列数据类型 BIT 宽度为 8 位。我也使用mysql_query("INSERT INTO n (reading) VALUES (b'".$value."')")并尝试过这个mysql_query("INSERT INTO n (reading) VALUES (".$value.")")。在插入值之前很好,但在插入它的值不同之后,它会更改值,例如在插入之前它会回显该值,116然后我回显它的二进制值1110100并将该值插入 mysql 列中00110000

function delta($reading){
    global $flag;
    $delta = $flag - $reading;
    saveDelta(decbin($delta));       
} 

这是另一个保存值的函数

function saveDelta($dif) {
  mysql_query("INSERT INTO n (reading) VALUES (".$dif.")");    
}
4

1 回答 1

2

如果正确编码为 and 的字符串,该语法"INSERT INTO n (reading) VALUES (b'".$value."')"应该可以工作。$value'0''1'

编辑:我注意到您在插入数据时没有提供任何“序列号”。但是,请记住,如果不使用适当的ORDER BY子句,您将无法按照最初输入的顺序检索字节。也许您认为您阅读了“116”但 MySQL 从表中返回了另一行?


下面是一些使用示例,首先使用BIT类型:

CREATE TABLE b (value BIT(8));
INSERT INTO b VALUES (0),(1), (255);
INSERT INTO b VALUES (b'00000000'),(b'00000001'), (b'11111111');

请注意,在检索BIT列时,您将获得签名结果(即:存储255将读取-1)。

您可以将数据检索为带符号的 10 基整数或二进制形式(带有可选填充):

SELECT value FROM b;
SELECT BIN(value) FROM b;
SELECT LPAD(BIN(value), 8, '0') FROM b;

就我自己而言,我更喜欢TINYINT UNSIGNED. 这是一个 8 位类型,支持相同的值语法(<10-base digit>b'xxxxxxxx')——但将接受说明UNSIGNED符:

CREATE TABLE t (value TINYINT UNSIGNED);
INSERT INTO t VALUES (0),(1),(255);
INSERT INTO t VALUES (b'00000000'),(b'00000001'), (b'11111111');

您可以将数据检索为无符号10 基整数或二进制形式(带有可选填充):

SELECT value FROM t;
SELECT BIN(value) FROM t;
SELECT LPAD(BIN(value), 8, '0') FROM t;

请参阅http://sqlfiddle.com/#!2/4ff44/6来试验它们。

于 2013-08-01T12:41:09.377 回答