2016-12-05 110 views
0

我試圖將bigint無符號數字的二進制表示存儲到MySql中的二進制(8)列中。例如,值9應該被存儲爲0...01001,其中包含一堆0 s的強制性左填充。這可能嗎?bigint轉換爲二進制(8)列的二進制表示

+0

一個'binary'列存儲八位位組,而不是比特。你的意思是bigint的無符號值應該存儲爲八位位組:0x00 0x00 0x00 0x00 0x00 0x09也稱爲[big endian](https: //en.m.wikipedia.org/wiki/Endianness) - 或者你在想別的什麼嗎? –

+0

準確地說 - 大端正是我想要的。 – gzak

回答

0
  • 使用CONV(..., 10, 16)將數字轉換從基座10到基座16
  • 採取這一結果和左襯它具有高達16的0:LPAD(..., 16,'0')
  • 採取這一十六進制編碼的串並轉換與爲二進制UNHEX(...)

所以你的表情是UNHEX(LPAD(CONV(/* input value or column here */,10,16),16,'0'))

實例使用HEX()函數把八位位組回十六進制,使我們可以看到的結果是:

mysql> SET @input = 9; SET @output = UNHEX(LPAD(CONV(@input,10,16),16,'0')); SELECT HEX(@output); 

+------------------+ 
| HEX(@output)  | 
+------------------+ 
| 0000000000000009 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SET @input = 65536; SET @output = UNHEX(LPAD(CONV(@input,10,16),16,'0')); SELECT HEX(@output); 

+------------------+ 
| HEX(@output)  | 
+------------------+ 
| 0000000000010000 | 
+------------------+ 
1 row in set (0.00 sec) 

-- largest possible bigint unsigned 
mysql> SET @input = 18446744073709551615; SET @output = UNHEX(LPAD(CONV(@input,10,16),16,'0')); SELECT HEX(@output); 

+------------------+ 
| HEX(@output)  | 
+------------------+ 
| FFFFFFFFFFFFFFFF | 
+------------------+ 
1 row in set (0.00 sec) 
+0

警告:不要在輸入表達式中使用任何涉及文字的數學運算,例如'CONV()'的第一個參數 - 例如不要嘗試'CONV(18446744073709551610 + 4,...'因爲MySQL不會做你想做的事情。對數字文字的算術運算是用雙精度浮點數學來完成的,這會導致大數和小數的近似誤差。參數是單個數字或bigint無符號列或變量,它們按預期工作。 –