我的表格中有以下数据:
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
然后我们可以将字符串转换为实数,不带符号,因为没有符号:(这里不能使用 binary 作为类型,因为它是 string type 。此步骤是可选的因为 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)
关于mysql - 在mysql中将varchar转换为二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52144865/