0

我编写了一个基于轻量级套接字的 HandlerSocket 查询系统,它运行良好....缺少这个小问题....

我在数据库中有一个表,其unique索引包含 5 个关键部分:

function, type, parameter, Module_ID, Site_ID

都是字符串,前 4 列是必需的,最后 (Site_ID) 不是 AND 它可能是NULL。简要说明是所有站点共享具有 的记录Site_ID = NULL,但是每个站点都可以用它自己的一条记录覆盖默认记录,并提供它们的特定记录Site_ID

我的 Sockets 查询准备请求,如下所示:

$request = array(
            'indexid' => $key,
            'op' => $query->get_type(),
            'vlen' => count($query->get_keys()),
            'keys' => implode("\t",$query->get_key_values()),
            'limit' => $query->get_limit(),
            'offset' => $query->get_offset());

// Join as TAB separated values
$request = implode("\t",$request)."\n";

因此,当提供所有 5 列部分和键值时,它可以工作,当提供前 4 列和前 4 个键值时,它可以工作,但是当使用所有 5 列和它们对应的第 5 列的键值NULL时,它什么也不返回我知道事实上有些记录与前 4 个匹配并且有一个NULLSite_ID。

我必须能够使用第三种情况,因为我需要确保它与任何定义了 Site_ID 的情况都不匹配。

我假设问题在于\t连接的键值,但我不确定这里使用的正确值是匹配 NULL 列值......因为它不是NULL.

如果有人可以阐明格式化此请求的正确方法,以便它可以匹配第NULL5 列,我将不胜感激!

4

1 回答 1

0

所以最后,它有助于 Re-RTM... 可以在这里找到:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en。文本

在开头部分Basic syntax,它指出:

NULL is expressed as a single NUL(0x00).

因此,我将键值准备调整为以下内容:

$values = $query->get_key_values();
foreach ($values as $vid => $value) { if (!isset($value)) { $values[$vid] = "\x00"; } }
$values = implode("\t",$values); // TAB Separated

这会将所有本机NULL值替换为 HEX Null 字节,该字节与空字符串不同,允许服务器将列与NULL值匹配。

希望对其他人有所帮助。

于 2013-10-03T13:27:47.400 回答