Правильный способ представления значения ключа NULL в необработанном запросе на основе сокетов на HandlerSocket

Я написал облегченную систему запросов HandlerSocket на основе сокетов, и она отлично работала.... если не считать одной маленькой проблемы....

У меня есть таблица в БД, которая имеет unique Индекс с 5 ключевыми частями:

function, type, parameter, Module_ID, Site_ID

Все являются строками, первые 4 столбца обязательны, последний (Site_ID) не является И это может быть 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 и имеют NULL Site_ID.

Я ДОЛЖЕН быть в состоянии использовать третий сценарий, потому что я должен быть уверен, что он не совпадает ни с одним, для которого определен Site_ID.

Я предполагаю, что проблема заключается в \t значения соединенного ключа, но я не уверен, что правильное значение, используемое здесь, должно соответствовать значению столбца NULL... потому что это не NULL,

Если кто-то может пролить свет на правильный способ форматирования этого запроса, чтобы он мог соответствовать NULL 5-я колонна, буду благодарен!

1 ответ

Решение

Таким образом, в конце концов, это помогает повторно RTM..., который можно найти здесь: https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en.txt

В первом разделе 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 ценности.

Надеюсь, что это помогает кому-то еще.

Другие вопросы по тегам