0

我有一個MySQL表中的下列數據爲什麼MySQL的BIT_OR()被返回比PHP位運算不同值

「數據轉儲」 2 phone_calls 001 2 phone_calls 010 2 phone_calls 100個 2 phone_calls 1000 2 phone_calls 10000個 2 phone_calls 100000

如果我運行PHP代碼做位或操作,像這樣

echo bindec('001') | bindec('010') | bindec('100') | bindec('1000') | bindec('10000') | bindec('100000'); 

我得到63「預計」輸出

,如果我做或手動

000001 
000010 
000100 
001000 
010000 
100000 
====== 
111111 

the result = 111111 which is `32 + 16 + 8 + 4 + 2 + 1 = 63` 

當我在MySQL

SELECT user_id, section_name, BIT_OR(permission_type) AS final 
FROM permissions 
WHERE section_name ='phone_calls' and user_id = 2 
GROUP BY user_id, section_name 

運行下面的查詢其基本運行BIT_OR()上面列出的「數據轉儲」和輸出是

2 phone_calls 108543 

爲什麼MySQL給我108543和PHP給我63?我怎樣才能讓MySQL給我63?

回答

2

108543是你得到什麼,當你or在一起小數{1, 10, 100, 1000, 10000, 100000}

換句話說,他們不被視爲二進制值。

您或者需要存儲二進制等值的正確十進制值{ 1, 2, 4, 8, 16, 32},或者找到一種方法將僅保留01數字的十進制變量轉換爲適當的值。

如果您想保留持有的位模式串,可以將它們轉換成十進制的東西,如:

conv(colname,2,10) 

它做了base conversion

mysql> select conv('10',2,10); 
    -> '2' 
mysql> select conv('1000',2,10); 
    -> '8' 
+0

我明白了:)我會給你正確的答案。但我留下了下面的下一個人的答案:)非常感謝。我應該如何讓列類型進行狂熱轉換? – Jaylen 2014-12-03 01:31:03

+0

@Mike,您可以保留它自解決方案以來的工作。我自己可能會存儲一個整數類型而不是字符串,因爲操作往往會更快,至少在常規數據庫中。不管這是MySQL的情況,我不知道。正如我似乎記得的那樣,如果它以任何方式將所有東西都存儲爲字符串,那麼差別可能不會那麼大。在任何情況下,第一條優化命令是「測量,不要猜測」,第二條是「檢查你的權限,不要僅僅因爲它們聽起來有知識而信任一些隨機的機器人」:-) – paxdiablo 2014-12-03 01:45:35

0

我知道了:)

SELECT user_id, section_name, BIT_OR(CONV(permission_type, 2, 10)) AS final 
FROM data_import.permissions 
WHERE section_name ='phone_calls' and user_id = 2 
GROUP BY user_id, section_name 
相關問題