php - 在 HandlerSocket 上基于原始套接字的查询中表示 NULL 键值的正确方法

标签 php mysql sockets nosql handlersocket

我编写了一个基于 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/

相关文章:

mysql基于用户id的排名系统

sql - 帮助从 MySQL 查询获取或显示 ColdFusion 中的随机记录?

linux unix套接字与tcp套接字发送缓冲区大小

c - 在 C 中使用 connect() 时使用临时 sockaddr_in 是否安全?

javascript - 无法使用 ChartJS 绘制图表

c - 设置正在运行的服务器和 Wifi 网络

php - 不要仅针对特定操作更新 "on update CURRENT_TIMESTAMP"

php - mysql 两个查询

php - 如何知道是否插入了新行,或者是否更新了现有行?

php - sql count 连接表中精确或相似记录的数量