2012-10-29 34 views
0

我的问题:我不能选择字段,“二进制”与MySQL无法选择二进制领域白衣PHP

structure db

这是查询(注意是“不等于”):

SELECT * 
FROM `pt_peers` 
WHERE `info_hash` != '7f398565868f7f08f71d236b88e4e433d2311de8' 

这是结构:

CREATE TABLE IF NOT EXISTS `pt_peers` (
    `info_hash` binary(20) NOT NULL, 
    `peer_id` binary(20) NOT NULL, 
    `compact` binary(6) NOT NULL, 
    `ip` char(15) NOT NULL, 
    `port` smallint(5) unsigned NOT NULL, 
    `state` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `updated` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`info_hash`,`peer_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

当我直接选择哈希,答案是零。 :/

的脚本是:PeerTracker

+0

用NOT IN试过了吗? – Reshad

+0

为什么'不在'?我只想选择带有散列的行,但是当我选择时,没有结果出现。 – Julien

回答

1

你好像路过的十六进制数字的ASCII表示,其中表定义为持股20个字节的二进制的40字节的字符串。

试试这个,用六角文字符号为二进制字符串:

SELECT * 
FROM `pt_peers` 
WHERE `info_hash` = x'7f398565868f7f08f71d236b88e4e433d2311de8' 

更多信息请参见this

+0

你是绝对正确的!这正是解决方案,谢谢你的帮助DaveRandom =) – Julien

+0

操作完成得很好,但是当我使用另一个散列(不存在于db)时,我有一个sql错误(和一个可能的sql注入):/ – Julien

+0

@ atmon3r你在使用准备好的语句吗?当散列不存在时,应该没有任何理由会得到错误,但是十六进制字符串符号确实需要字符串中偶数个数字。你在使用哪种数据库驱动程序?你能显示一些你的查询PHP代码吗? – DaveRandom