語法與行為
INSTR(str, substr) -- 返回 substr 在 str 中首次出現位置 (1-based),不存在返回 0
-- 等價於 LOCATE(substr, str) / POSITION(substr IN str)
基本範例
SELECT INSTR('www.example.com', '.'); -- 4
SELECT INSTR('foobarbar', 'bar'); -- 4
SELECT INSTR('foobar', 'xbar'); -- 0
替代 LIKE '%keyword%' 的高效寫法
-- 原本全表掃描
SELECT * FROM articles WHERE content LIKE '%mysql%';
-- 使用 INSTR 同樣全表掃描,但可讀性略優,效能相近
SELECT * FROM articles WHERE INSTR(content, 'mysql') > 0;
⚠ INSTR/LOCATE 同樣無法使用索引,本質仍是全表掃描。真正高效方案見下。
真正的高效替代方案
| 方案 | 適用場景 | 建立語法 |
| 全文索引 | 自然語言長文搜尋 | ALTER TABLE t ADD FULLTEXT(content); SELECT * FROM t WHERE MATCH(content) AGAINST('mysql'); |
| 關鍵字/Tag 反向索引表 | 精準關鍵字過濾 | 應用層寫入時拆詞建立 keyword_article 映射表 |
| Elasticsearch / MeiliSearch | 複雜搜尋、高亮、分面 | 資料同步至搜尋引擎,MySQL 僅存主鍵 |
INSTR 進階用法:動態截取
-- 取第一個 '.' 之前的網域
SELECT SUBSTRING_INDEX('www.example.com', '.', 1); -- www
-- 結合 INSTR 定位
SELECT SUBSTR(url, 1, INSTR(url, '/', 9) - 1) FROM logs; -- 取協議後第一個 / 前內容
多字節與大小寫
- 多字節安全(UTF-8/GBK 均正確)。
- MySQL 4.0+ 僅在參數含二進位字串時區分大小寫,預設不區分(依校對規則
_ci)。
- 強制區分大小寫:
INSTR(BINARY str, BINARY substr) 或欄位校對 _bin。