Правильный способ представления значения ключа 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
ценности.
Надеюсь, что это помогает кому-то еще.