2016-12-05 114 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无符号列或变量,它们按预期工作。 –