首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MyCat 1.5~1.6 checkSQLschema Bug:點號字串被誤解析

     編輯:MySQL 綜合教學

MyCat 1.5~1.6 checkSQLschema Bug:點號字串被誤解析

MyCat 作為資料庫中間件,開啟 checkSQLschema="true" 可攔截跨分片查詢,但在 1.5~1.6 版本中存在解析缺陷:WHERE 條件中的字串字面值若包含點號 .,會被錯誤移除。

問題重現

正常 SQL (MySQL 直連執行成功)

SELECT * FROM device 
WHERE devicetype = 'AMS.Monitoring.XlCloud.QKL8154.XLCloudDevice';

MyCat 開啟 checkSQLschema 後

# schema.xml

    

EXPLAIN 顯示被改寫為

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 字串含點號

升級建議

  1. 升級至 MyCat 1.6.7+ 或 2.x:官方已修復該 Tokenizer Bug。
  2. 若無法升級:應用層統一轉義點號,或關閉 checkSQLschema (失去跨分片保護)。
  3. 測試驗證:上線前跑全量 SQL 測試套件,專門測試含點號字串的查詢。

配置最佳實務

# schema.xml 建議配置

    
    

相關 Issue 追蹤

中間件解析器 Bug 極難排查,建議在測試環境建立「含特殊字元字串」的回歸測試集,覆蓋點號、引號、反斜線、Unicode 等邊界情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved