產生 TypeScript/JavaScript 程式碼,用於讀取/解碼以及寫入/編碼 ClickHouse RowBinary 串流,適用於 ClickHouse HTTP 伺服器。當使用者需要解析或產生 `RowBinary`、`RowBinaryWithNames` 或 `RowBinaryWithNamesAndTypes` 時使用此技能。僅限 Node.js,不涵蓋瀏覽器。
ClickHouse JS RowBinary 編碼器產生器(Node.js)
此技能產生兩種方向的線路格式:讀取器(解碼位元組 → 數值)和寫入器(編碼數值 → 位元組,為鏡像)。一般任務只需要其中一個方向。此檔案為共用入口點 — 格式閘門以及兩個方向共用的原則;各方向的決策、指引以及型別參考表格位於兩個同級檔案中。
選擇你的方向 — 只讀取你需要的部分:
- 從 ClickHouse 解碼
RowBinary*回應為 JS 數值 →
reader.md。串流 vs 完整緩衝區、列物件 vs 欄位式、
固定 vs 執行時期結構,以及各型別讀取器參考。 - 將 JS 數值編碼為
RowBinary負載以傳送至 ClickHouse →
writer.md。Sink/writeX建構區塊、writeRows
串流,以及各型別寫入器參考。
各型別的程式碼是真實的,按方向分別位於 src/readers/ 和 src/writers/ 下。
首先:RowBinary 是正確的格式嗎?
RowBinary 存在是為了吞吐量,但它不自動是最快的路徑 — 在投入自訂解析器之前,請將格式與資料形狀匹配。
當結果主要是字串 / JSON 類數值,且你整體消費它們時(隨機存取每個欄位、執行字串/正規表達式方法、將數值視為文字),優先使用 JSON* 格式(例如 JSONEachRow)。 V8 原生的 JSON.parse 是高度最佳化的 C++,建構 JS 字串和物件比 JS 層級的 RowBinary 解碼器更快;搭配 HTTP 回應壓縮(gzip / zstd,可壓縮 JSON 重複的鍵)也能減少線路成本。
RowBinary 在以下情況明顯勝出: 結果主要由以下組成:
- 寬數值型 —
Int128/Int256/UInt128/UInt256、
Decimal128/Decimal256。 - 二進位 / 固定寬度 blob —
IPv4、IPv6、UUID、FixedString。 - 高流量固定寬度數值欄位一般情況,每個數值都是單一
DataView讀取。
當欄位式載入和客戶端分析是主要目標時(折疊/掃描/過濾欄位、將型別陣列餵給 Worker 或 WASM),優先使用 Native 格式。 Native 是欄位主軸,因此可直接載入每個欄位一個型別陣列,無需轉置。
如需協助選擇和消費 JSON* 格式(或 CSV / TSV),請使用 clickhouse-js-node-coding 技能。
核心指引(兩個方向)
無論你產生的是讀取器還是寫入器,這些原則都適用;各方向的具體操作指引在 reader.md / writer.md 中。
-
僅限小端序。 RowBinary 是小端序;目標為 x86/ARM。使用
DataView存取器讀取和寫入每個多位元組數字時,傳遞字面值true作為littleEndian旗標。 -
先正確,再最佳化。 首先使用純各型別 API 產生正確的編碼器。只有在正確(且經過測試)之後才進行特化。不要在正確性之前就預設效能假設。
-
單形化泛型/複合型別。 針對每種型別組合產生特化、內聯的程式碼,而不是在型別已知時將函式作為引數傳遞。
-
內聯葉節點操作。 各型別的
readX/writeX函式是正確、可組合的參考;產生的編碼器應內聯其主體,而不是呼叫它們,這樣列迴圈就是直線的,沒有每個欄位的間接性(這樣固定寬度合併可以將偏移量算術折疊在一起)。 -
為每個欄位註解型別。 內聯會抹除型別結構,因此在每個欄位的編碼/解碼區塊上方放置一個簡短註解,命名它處理的 ClickHouse 型別。
-
共享暫存區不可重入。 某些熱門方法會重複使用模組層級的暫存緩衝區作為寫入後讀取配對 — 正確僅因為存取是完全同步的。在填充和讀取之間有
async/yield邊界會破壞數值。 -
預設使用 TypeScript。 除非使用者明確要求純 JavaScript,否則產生 TypeScript 程式碼和輔助函式。
實例
六個端到端實例及實際加速效果收錄在 EXAMPLES.md 中。
不涵蓋範圍
- JSON / CSV / TSV / Parquet 解析 → 使用
clickhouse-js-node-coding。 - 連線錯誤、掛起、型別不匹配 → 使用
clickhouse-js-node-troubleshooting。 - 瀏覽器 / Web Worker / Edge → 使用
@clickhouse/client-web。






