我编写了一个基于 HandlerSocket 查询系统的轻量级套接字,它工作得很好......除了这个小问题......
我在数据库中有一个表,其中有 unique
索引包含 5 个关键部分:
function, type, parameter, Module_ID, Site_ID
全部都是字符串,前 4 列是必需的,最后一个 (Site_ID) 不是,并且可能是 NULL
。简单的解释是所有站点共享具有 Site_ID = NULL
的记录。 ,但是每个站点都可以使用自己的特定记录之一覆盖默认记录 Site_ID
提供。
我的套接字查询像这样准备请求:
$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 个匹配并且具有 NULL
时,它不会返回任何内容。 Site_ID。
我必须能够使用第三个场景,因为我需要确保它与任何已定义 Site_ID 的场景都不匹配。
我假设问题出在 \t
连接键值,但我不确定此处使用的正确值是匹配 NULL 列值...因为它不是 NULL
.
如果有人可以阐明格式化此请求的正确方法,以便它可以匹配 NULL
第五栏,我将不胜感激!
最佳答案
所以最后,它有助于重新 RTM...可以在这里找到:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en.txt
在开头部分基本语法
中指出:
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
这会将所有 native NULL
值替换为十六进制 Null 字节,该字节与空字符串不同,允许服务器将列与 NULL
值相匹配。
希望对其他人有帮助。
关于php - 在 HandlerSocket 上基于原始套接字的查询中表示 NULL 键值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146604/