搜尋打 % 或 _ 會搜出一堆不相干的——那兩個字被當成萬用字元 #94

Open
opened 2026-08-12 02:09:44 +00:00 by Leo · 0 comments
Owner

查詢字串裡的 %_ 會被當成萬用字元,搜出一堆不相干的東西。

怎麼撞到的(2026-08-12,補驗 a7e23ba 時順手抓到)

關鍵字搜尋把使用者輸入直接組進 SQL 的 LIKE pattern,沒有跳脫。所以:

查 100%_test  → 回 50 筆   ← `%` 當「任意字串」、`_` 當「任意一字」

這是舊病,不是斷詞那筆帶進來的——改斷詞之前整串 LIKE 幾乎永遠 0 命中,
所以這個洞被另一個洞蓋住了。斷詞讓搜尋真的會回東西之後,它才浮出來。

要達成什麼

使用者打什麼字,就照那些字找。 %_、跳脫字元本身都要當一般字元看待。

怎麼驗才算數

  1. 100% 只回真的含 100% 的,不回別的;查 a_b 同理
  2. 現有的搜尋測試全綠(改前 18 檔/197 tests)
  3. 貼前後對照的實際輸出

紅線

  • 不准為了跳脫就改成別種比對機制(那是 FTS5 的題目,另一回事)
  • 資料層照既有規約走(Leo/Arcrun 的 kbdb 三表不變)

相關

Leo/Arcrun#84(斷詞補驗,這個洞在那裡被發現)

**查詢字串裡的 `%` 和 `_` 會被當成萬用字元,搜出一堆不相干的東西。** ## 怎麼撞到的(2026-08-12,補驗 `a7e23ba` 時順手抓到) 關鍵字搜尋把使用者輸入直接組進 SQL 的 LIKE pattern,沒有跳脫。所以: ``` 查 100%_test → 回 50 筆 ← `%` 當「任意字串」、`_` 當「任意一字」 ``` **這是舊病,不是斷詞那筆帶進來的**——改斷詞之前整串 LIKE 幾乎永遠 0 命中, 所以這個洞被另一個洞蓋住了。斷詞讓搜尋真的會回東西之後,它才浮出來。 ## 要達成什麼 **使用者打什麼字,就照那些字找。** `%`、`_`、跳脫字元本身都要當一般字元看待。 ## 怎麼驗才算數 1. 查 `100%` 只回真的含 `100%` 的,不回別的;查 `a_b` 同理 2. 現有的搜尋測試全綠(改前 18 檔/197 tests) 3. 貼前後對照的實際輸出 ## 紅線 - 不准為了跳脫就改成別種比對機制(那是 FTS5 的題目,另一回事) - 資料層照既有規約走(`Leo/Arcrun` 的 kbdb 三表不變) ## 相關 `Leo/Arcrun#84`(斷詞補驗,這個洞在那裡被發現)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Leo/Arcrun#94