在MySQL中将varchar转换为二进制?

时间:2018-09-03 07:18:33

标签: mysql sql

我在一个表格中有以下数据:

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  |
    +-------+----------+

5 个答案:

答案 0 :(得分:1)

您可能必须以“硬性”方式执行此操作,并在教师或其他表中创建位字段,内部转换似乎比强制转换和转换要好

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)

答案 1 :(得分:1)

由于接受的答案过于复杂,这里给出一个简洁的答案:

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)

答案 2 :(得分:0)

您应该使用CONV mysql函数

select id, CONV(BINARY(accessto), 2, 10) from tutor;

答案 3 :(得分:0)

从您的列中删除b

并按照下面的转换将起作用

select CONV('1011', 2, 10)

您可以通过以下方式删除b并使用conv

select id,CONV(TRIM(LEADING 'b' FROM accessto), 2, 10) from table1

答案 4 :(得分:0)

-将“二进制”替换为“未签名”

select id, cast(accessto as UNSIGNED) from tutor;