MySQL中的二进制数据

4

我需要在MySQL中存储二进制数据,例如1110000。当我选择它时,我需要返回值仍然是相同的1110000

我应该使用哪种数据类型?可以使用bit吗?还是varbinary更好?


1
位数是否有限制?(换句话说,二进制字符串的最大长度是否已知)。 - Tarydon
不是的,我想要存储的比特数是不同的。 - putse
我不知道你的使用情况,但如果你绝对需要从00011中获得00011,你可以在所有情况前面插入一个1,然后去掉前导1,这样你就插入了100011并得到了100011。 - MindStalker
通过说“当我选择它”时,您真的只是指选择字段,还是允许在查询中进行一些对话?客户端(应用程序)转换怎么样?最好的方法是将值存储为BLOB字段,并在应用程序中将其从/转换为位数组。 - leemes
2个回答

10

处理二进制数时,您可以使用位字段,例如:

bit(64)

这是一个最多具有64个有效比特(允许的最大尺寸)的位域。

为了插入常量值,您可以使用 b'值' 的表示方法,如下所示:

insert into bits values (b'0001001101001');
您可以通过添加0或使用cast()来将位域转换为数字。此外,还有方便的bin()、hex()和oct()函数可打印特定进制下的值。如果非数值类型,varbinary或blob是最有效的存储方法,binary也可用(它会使用空字节填充较短的值)。如果您不想处理转换,可以将字符串存储在varchar或char中。它只会使用紧凑varbinary的约8倍空间。要从应用程序中插入/读取,您需要将序列转换为打包的字节数组,然后将打包的字符串存储在varbinary列中。在C#中,您可以使用BitConverter,在php中,您可以使用pack/unpack。

我尝试过执行以下操作: INSERT INTO db_test.t_bits (val) VALUES (b '0001001101001');然后执行以下操作: SELECT val+0 FROM t_bits,它返回617 SELECT cast(val as unsigned) FROM t_bits 也返回617 SELECT cast(val as binary) FROM t_bits,它返回'i' SELECT bin(val) FROM t_bits,它返回'1001101001'我想要的返回值与插入的值相同。'0001001101001'如何在blob中实现?我不明白。我很困惑..非常感谢。 - putse
在数值中,前导零并不重要,因此0001001101001被读作1001101001,这是617。对于非数字,最简单的方法是将其存储在varchar或char中。 - jspcal
我需要一种占用最小存储空间的数据类型。如果是这样,我宁愿使用varbinary,对吧?因为根据MySQL手册,varchar和varbinary的存储要求是相同的。难道没有其他方法可以使用位数据类型吗?我还是很好奇。您能解释一下如何使用blob存储二进制字符串(而不是图像)吗?谢谢您的回答,jspcal.. :) - putse

1
希望这段代码能对您有所帮助:

选择:

     select conv(column_name, from_base, to_base) from table_name
     //example:
     select conv(column1, 10, 2) from table1;

用于插入:

     insert into table_name(column1) values( B'binary_data') ;
     //example : 
     insert into table1(column1) values( B'1110000');

查询用途:

    select column1,column2 from table_name where column1 & B('binary_data');
    //example: 
    select column1, column2 from table1 where column1 & B('1110000');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接