2012-09-14 18 views

回答

1
SELECT * FROM t WHERE c LIKE '%(__)%' 

SQL小提琴here

+0

它錯過了'()'之間有兩個中文字符的情況。 – qazwsx

+0

它確實有用,但只適用於英文括號,那麼對於中文的'(__)'呢? – qazwsx

+0

'LIKE'可能無法正確處理括號中的一個或兩個多字節字符,但對於多字節圓括號字符本身(U + FF08和U + FF09)應該沒有問題,因爲它們是作爲LIKE模式中的文字值。 –

0

你的逃生關閉了。

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

因爲MySQL在字符串中使用C轉義語法(例如,「\ n」來代表換行字符),你必須加倍任何「\」您在REGEXP字符串中使用。

用途:

SELECT * FROM t WHERE c REGEXP '.*\\(..\\).*'; 
+0

這隻適用於拉丁字符之間'()'如果我需要找到那些情況是什麼地方在'兩個字符()'都是非拉丁文,例如中國字符? – qazwsx

+0

不知道是否可以做到。 「警告 REGEXP和RLIKE操作符按字節方式工作,因此它們不是多字節安全的,並且可能會產生具有多字節字符集的意外結果。此外,這些運算符通過字節值和重音字符比較字符即使給定的整理將它們視爲平等,也不會相等。「 http://dev.mysql.com/doc/refman/5.0/en/regexp.html – Kos

+1

如果可以的話,請使用'like',請參閱@ Fred的答案 – Kos

-1

你是如何運行此查詢?如果你在(比如說)的PHP腳本使用它,像這樣寫的:

$sql = "SELECT ... REGEXP '.*\(..\).*';"; 

那麼PHP解釋器實際上將被剝離出來的反斜線,產生真正的查詢

... REGEXP '.*(..).*'; 

這只是任何有至少兩個字符的記錄。爲了這個正常工作,你必須雙逃生:

$sql = "SELECT ... REGEXP '.*\\(..\\).*';"; 

PHP將剝離從各組反斜槓之一,離開第二個實際上達到的MySQL。

+0

這是MySQL解析器本身去掉這些斜線,而不是PHP。嘗試'echo'\(asdf \)';'在php中 - 斜槓仍然存在 – Kos

相關問題