簡體   English   中英

在mysql中將varchar轉換為二進制?

[英]converting varchar to binary in mysql?

我在這樣的表中有以下數據:

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

您可能必須以“困難”的方式執行此操作並在導師或另一個表中創建一個位字段,內部轉換似乎比強制轉換和轉換更好

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)

由於接受的答案不必要地復雜,這里是一個簡潔的答案:

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作為類型,因為它是字符串類型。這一步是可選的,因為 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)

從列中刪除b

並按照下面的轉換它將起作用

select CONV('1011', 2, 10)

您可以通過以下方式刪除b和使用conv

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

您應該使用 CONV mysql 函數

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

-- 將 'binary' 替換為 'UNSIGNED'

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM