2022-10-27

MySQL 5.7 REGEXP 的坑,不支援 Capturing Group ( )

這是在案子上遇到的一次很奇異的狀況…

先描述環境

  • a 區
    • mysql 5.7.40
  • b 區
    • mysql 8.0.31
  • Local
    • mysql 8.0.31

在下的 case 是要在過濾出「不是以 A123 為開頭編號」,要達成這樣的查詢語句(在下只列出 where clause)
  1. WHERE `sn` NOT LIKE 'A123%'
  2. WHERE `sn` REGEXP '^(?!A123).+'
  3. WHERE `sn` NOT REGEXP '^A123'
在下在local開發時,使用 2 的查詢子句,能正確的查詢到結果,然後傳上 b區 要交由 pm 測試,也正常…

所以在下就很放心的直上到 a區 給客戶測,但錯就錯在自己傳上去 a區 時沒馬上自己試試,結果當天下午 pm 就告知客戶有反應有一個功能查出來的資料都是空的,但明明檢查了一下至少會有五、六筆資料的才對,要在下檢查一下。

在下先是看 local 上的版本反應…正常
再看 b區 的反應…正常
那就打開 a區… server error !!!!

奇異了…

後來找出 log 來看,就發現了錯誤訊息「Got error 'repetition-operator operand invalid' from regexp」…

後來在網路上翻找了一下資料,原來在 mysql 8 之前,mysql 的正規表示法是不支援 capturing group 這種用小括號去群組化的方式的…

所以之後在下改用 1 就安然無事了