使用MySQL将二进制转换为十进制

5
我将尝试在MySQL中构建一个查询,将一堆二进制字段连接起来,然后将结果作为十进制数返回。
例如:
SELECT CONCAT (setting1, setting2, setting3) AS settings;

可能给我:

101
111
110

我希望将这个值传递给一个函数(转换?转型?),这个函数会返回相应的DECIMAL值:
5
7
6

我已经尝试了一些cast()convert()的组合,但还没有成功。


1
http://sqlfiddle.com/#!2/d41d8/884 - goat
4个回答

4

将setting1和setting2合并后转为二进制,再将二进制转为十进制


最佳、最短、最精确的答案。 - Payel Senapati

1

没试过,但可以试一下。

首先,假设你的输入是6。

INSERT INTO Table (FieldTest) VALUES (UNHEX(CONV(6, 10, 16)))
SELECT CONV(HEX(UNHEX(6)), 16, 10)

带有一个字段

SELECT CONV(HEX(FieldTest), 16, 10))

UNHEX将数据从十六进制转换为二进制。

CONV将数据从一种基数转换为另一种基数。

这里将10进制转换为16进制(dec to hex),然后再进行hex到bin的转换。

在选择时,我们进行BIN到HEX,HEX到BIN的转换。

实际上,您可以只需执行CONV(6, 10, 2),并在读取时反向执行即可。


尝试过了,但似乎不太行。我认为问题可能在于 CONCAT(setting1,setting2,setting3) - 这会给我们一个由1和0组成的字符串 --- 可能需要将其转换为二进制? - Tenakha
你的领域是二进制吗?因为如果你运行这个代码:SELECT CONV(HEX(UNHEX(6)), 16, 10),结果将会是 6 - David Bélanger
不,该字段是一个字符串,因为当您将所有单独的1和0连接起来时,您会得到一个字符串。 - Tenakha
@Tenakha 这就是为什么。使用BINARY字段将数据存储为二进制。即使只有110或111...使用BINARY(2)来存储像111101000101这样的字符串... - David Bélanger

0

你可以尝试在二进制中进行幂运算

SELECT setting1 * 4 + setting2 * 2 + setting3 * 1 AS settings;

但它的意思是

SELECT setting1 * POW(2, 2) + setting2 * POW(2, 1) + setting3 * POW(2, 0) AS settings;

2^0代表最右边的位

2^1是第二个,以此类推...

将来如果你在MySQL中有二进制列,将它们合并成一个可能更容易[在列上留下注释以记住顺序]

你可以像这样向数据库添加数据

INSERT INTO settings (setting) VALUES (setting1 * 4 + setting2 * 2 + setting1 * 1);

并使用以下代码将其单独提取出来 SELECT setting & 2 FROM settings; 将返回setting2的值。

查看按位函数


0

可能有点晚了,但如果有人来到这里,我们可以将几个函数组合起来解决问题。

第一个函数是CONV,它允许我们将输入从一种进制转换为另一种进制,以下示例将101从2进制(二进制)转换为10进制(十进制):

SELECT CONV(101, 2, 10)

如果源代码是字符串,我们可以使用强制转换将其首先转换为二进制,例如:

SELECT CONV(CAST('11' AS BINARY), 2, 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接