我在这样的表中有以下数据:
create table tutor(
id int,
accessto varchar(8)
);
数据如下所示:
+-------+----------+
| id | accessto |
+-------+----------+
| 69 | b'1011' |
| 162 | b'1011' |
| 232 | b'1011' |
| 257 | b'0010' |
| 258 | b'1011' |
| 258 | b'1011' |
| 258 | b'1011' |
| 258 | b'1011' |
| 258 | b'1011' |
| 258 | b'1011' |
| 258 | b'1110' |
| 258 | b'1001' |
| 258 | b'0011' |
| 258 | b'1001' |
+-------+----------+
我想将其转换为二进制。怎么可能?
我尝试了这些查询,但得到相同的结果:
select id, cast(accessto as BINARY) from tutor;
select id, convert(accessto,binary) from tutor;
怎么做?
我的预期结果应该是这样的:
+-------+----------+
| id | accessto |
+-------+----------+
| 69 | 11 |
| 162 | 11 |
| 232 | 11 |
| 257 | 2 |
| 258 | 11 |
| 258 | 11 |
| 258 | 11 |
| 258 | 11 |
| 258 | 11 |
| 258 | 11 |
| 258 | 14 |
| 258 | 9 |
| 258 | 3 |
| 258 | 9 |
+-------+----------+
由于接受的答案过于复杂,因此这里有一个简洁的答案:
TLDR;
结果可以通过一个步骤实现:
SELECT CONV(TRIM("'" FROM SUBSTRING("0b'1011'", 3)), 2, 16);
解释
起点是包含0b1011
的字符串:
SET @string = "0b'1011'"; -- (string) 0b'1011'
我们可以应用字符串运算来使其更接近数字:
SET @plainnumber = TRIM("'" FROM SUBSTRING(@string, 3)); -- (string) 1011
然后我们可以将字符串转换为实数,不带符号,因为没有:(您不能在此处使用二进制作为类型,因为它是字符串类型。此步骤是可选的,因为MySQL将隐式强制转换。
SET @number = CAST(@plainnumber AS UNSIGNED); -- (unsigned) 1011
您现在可以用它做任何您想做的事情。OP 希望获得可以使用 CONV 获取的十进制表示形式:
SELECT CONV(@number, 2, 10);
十六进制说明
如果起点是包含十六进制表示形式的字符串:
SET @string = "41"; -- 0x41
可以使用 UNHEX 函数获取二进制字符串:
SELECT UNHEX(@string);
或者您可以使用 CONV 获取数值表示形式:
SELECT CONV(@string, 16, 10); -- decimal (65)
SELECT CONV(@string, 16, 2); -- binary (0100 0001)
您可能必须以"困难"的方式执行此操作,并在 tutor 或其他表中创建一个位字段,内部转换似乎比 cast 和转换效果更好
drop table if exists t;
create table t(
id int,
accessto varchar(8),
abit bit(8)
);
insert into t(id,accessto) values
( 69 , b'1011') ,
( 162 , b'1011') ,
( 232 , b'1011') ,
( 257 , b'0010') ,
( 258 , b'1011') ,
( 258 , b'1011') ,
( 258 , b'1011') ,
( 258 , b'1011') ,
( 258 , b'1011') ,
( 258 , b'1011') ,
( 258 , b'1110') ,
( 258 , b'1001') ,
( 258 , b'0011') ,
( 258 , b'1001') ;
update t
set abit = accessto;
MariaDB [sandbox]> select bin(abit),cast(abit as unsigned) from t;
+-----------+-------------------------+
| bin(abit) | cast(abit as unsigned) |
+-----------+-------------------------+
| 1011 | 11 |
| 1011 | 11 |
| 1011 | 11 |
| 10 | 2 |
| 1011 | 11 |
| 1011 | 11 |
| 1011 | 11 |
| 1011 | 11 |
| 1011 | 11 |
| 1011 | 11 |
| 1110 | 14 |
| 1001 | 9 |
| 11 | 3 |
| 1001 | 9 |
+-----------+-------------------------+
14 rows in set (0.00 sec)
你应该使用 CONV mysql 函数
select id, CONV(BINARY(accessto), 2, 10) from tutor;
-- 将"二进制"替换为"无符号">
select id, cast(accessto as UNSIGNED) from tutor;