为什么这个字符串不能用于二进制转换?

Dev*_*von 6 mysql sql string binary

我将IPv6地址存储为BINARY(16)并尝试使用十六进制表示来搜索它们,例如:FFFFFFFF000000000000000000000000.

这有效:

SELECT * FROM ipv6 WHERE HEX(address) = 'FFFFFFFF000000000000000000000000'
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

SELECT * FROM ipv6 WHERE address = CONV('FFFFFFFF000000000000000000000000', 16, 2)
Run Code Online (Sandbox Code Playgroud)

没有错误消息,只是不返回任何结果.MySQL无法使用CONV()?处理转换?

我可以使用第一个选项,但我想第二个选项在大型数据库中要快得多,因为它不必转换表中的每个地址.

更新:

UNHEX()杰克指出,似乎工作得很好.标准转换(自5.6起)使用CONV()似乎最大为8字节(64位)或十六进制形式,FFFFFFFFFFFFFFFF因此它无法处理完整的128位ipv6地址.

经过一番商议,我相信Salman的答案是处理十六进制的最佳方法(使用十六进制文字).但是,unhex()如果在PHP中使用参数绑定,则需要afaik,因为将添加引号并阻止MySQL将其作为文字与字符串进行评估.

因此,您必须为您选择最佳解决方案.十六进制文字有点快,但是如果你正在处理用户输入,那么带有参数绑定的unhex可能是最好的解决方案.

Sal*_*n A 2

您可以使用十六进制文字

SELECT * FROM ipv6 WHERE address = 0xFFFFFFFF000000000000000000000000;
SELECT * FROM ipv6 WHERE address = X'FFFFFFFF000000000000000000000000';
Run Code Online (Sandbox Code Playgroud)

如果您使用 PDO,您可以简单地执行以下操作:

SELECT * FROM ipv6 WHERE address = 0xFFFFFFFF000000000000000000000000;
SELECT * FROM ipv6 WHERE address = X'FFFFFFFF000000000000000000000000';
Run Code Online (Sandbox Code Playgroud)