0

私は軽量ソケット ベースの HandlerSocket クエリ システムを作成しましたが、これは完全に機能しました....この 1 つの小さな問題を除いて....

DB に、unique5 つのキー部分を持つインデックスを持つテーブルがあります。

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 が定義されているものと一致しないことを確認する必要があるため、3 番目のシナリオを使用できる必要があります。

問題は結合されたキー値にあると想定しています\tが、ここで使用する正しい値が NULL 列の値と一致するかどうかはわかりません...そうではないためNULLです。

5 番目の列に一致するように、このリクエストをフォーマットする正しい方法について誰かが光を当てることができればNULL、私は感謝します!

4

1 に答える 1

0

最終的には、Re-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 バイトに置き換えられ、サーバーが列をNULL値に一致させることができます。

それが他の誰かを助けることを願っています。

于 2013-10-03T13:27:47.400 に答える