SELECT * FROM t WHERE c REGEXP '.*\(..\).*';
這沒有奏效。它返回了許多行,它們的c
包含字符串,它們在()
中有兩個以上的字符。如何選擇col在圓括號中包含兩個字符的行?
SELECT * FROM t WHERE c REGEXP '.*\(..\).*';
這沒有奏效。它返回了許多行,它們的c
包含字符串,它們在()
中有兩個以上的字符。如何選擇col在圓括號中包含兩個字符的行?
SELECT * FROM t WHERE c LIKE '%(__)%'
SQL小提琴here
你的逃生關閉了。
http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp
因爲MySQL在字符串中使用C轉義語法(例如,「\ n」來代表換行字符),你必須加倍任何「\」您在REGEXP字符串中使用。
用途:
SELECT * FROM t WHERE c REGEXP '.*\\(..\\).*';
你是如何運行此查詢?如果你在(比如說)的PHP腳本使用它,像這樣寫的:
$sql = "SELECT ... REGEXP '.*\(..\).*';";
那麼PHP解釋器實際上將被剝離出來的反斜線,產生真正的查詢
... REGEXP '.*(..).*';
這只是任何有至少兩個字符的記錄。爲了這個正常工作,你必須雙逃生:
$sql = "SELECT ... REGEXP '.*\\(..\\).*';";
PHP將剝離從各組反斜槓之一,離開第二個實際上達到的MySQL。
這是MySQL解析器本身去掉這些斜線,而不是PHP。嘗試'echo'\(asdf \)';'在php中 - 斜槓仍然存在 – Kos
它錯過了'()'之間有兩個中文字符的情況。 – qazwsx
它確實有用,但只適用於英文括號,那麼對於中文的'(__)'呢? – qazwsx
'LIKE'可能無法正確處理括號中的一個或兩個多字節字符,但對於多字節圓括號字符本身(U + FF08和U + FF09)應該沒有問題,因爲它們是作爲LIKE模式中的文字值。 –