MyCat 作為資料庫中間件,開啟 checkSQLschema="true" 可攔截跨分片查詢,但在 1.5~1.6 版本中存在解析缺陷:WHERE 條件中的字串字面值若包含點號 .,會被錯誤移除。
SELECT * FROM device WHERE devicetype = 'AMS.Monitoring.XlCloud.QKL8154.XLCloudDevice';
# schema.xml
SELECT * FROM device WHERE devicetype = 'AMS.XlCloud.QKL8154XLCloudDevice'; # 少了 Monitoring. 且 QKL8154.XLCloudDevice 變成 QKL8154XLCloudDevice
MyCat 的 SQL 解析器 (基於 Cobar/Alibaba SQL Parser) 在 checkSQLschema 模式下,會嘗試解析 SQL 結構以判斷分片鍵。其 Tokenizer 錯誤地將字串字面值內的點號視為「識別符分隔符」 (如 table.column),導致字串內容被破壞。
SELECT * FROM device WHERE devicetype = 'AMS\.Monitoring\.XlCloud\.QKL8154\.XLCloudDevice';
在 MyCat 解析層面,反斜線轉義後的點號不再被視為分隔符,SQL 可正確路由。
| 場景 | 是否受影響 | 說明 |
|---|---|---|
| WHERE 字串含點號 | ✅ 是 | 如 URL、FQDN、版本號、JSON 路徑 |
| WHERE 字串含其他標點 | ❌ 否 | 底線、連字號、冒號等正常 |
| 數值/日期比較 | ❌ 否 | 無字串字面值 |
| JOIN ON 條件 | ⚠️ 可能 | 若 ON 子句含字串常數 |
| INSERT VALUES | ⚠️ 可能 | VALUES 字串含點號 |
checkSQLschema (失去跨分片保護)。# schema.xml 建議配置
中間件解析器 Bug 極難排查,建議在測試環境建立「含特殊字元字串」的回歸測試集,覆蓋點號、引號、反斜線、Unicode 等邊界情況。