2012-09-14 1 views

Répondre

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

SQL Fiddle here

+0

Il manque les cas où il y a deux caractères chinois entre '()'. – qazwsx

+0

Cela fonctionne réellement, mais seulement pour les parenthèses anglais, qu'en est-il pour les Chinois? (__) '? – qazwsx

+0

'LIKE' peut ne pas gérer correctement un ou deux caractères multi-octets entre les parenthèses, mais vous ne devriez pas avoir de problème avec les parenthèses multi-octets eux-mêmes (U + FF08 et U + FF09), car ils sont fournis comme valeurs littérales dans le modèle LIKE. –

0

Vos échappements sont désactivés.

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

Comme MySQL utilise la syntaxe d'échappement C dans les chaînes (par exemple, « \ n » pour représenter le caractère de saut de ligne), vous devez doubler tous les « \ » que vous utilisez dans vos expressions REGEXP.

Utilisation:

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

Cela ne fonctionne que pour les caractères latins entre '()' si je dois trouver les cas où les deux caractères '()' sont non latins, par exemple chinois personnages? – qazwsx

+0

Je ne sais pas si cela peut être fait. "Avertissement Les opérateurs REGEXP et RLIKE fonctionnent de manière octet, ils ne sont donc pas sécurisés sur plusieurs octets et peuvent produire des résultats inattendus avec des jeux de caractères multi-octets De plus, ces opérateurs comparent les caractères par leurs valeurs d'octets et leurs caractères accentués. ne pas comparer comme égal même si une collation donnée les traite comme égaux. " http://dev.mysql.com/doc/refman/5.0/fr/regexp.html – Kos

+1

Utilisez 'like' à la place si vous le pouvez, voir la réponse de Fred @ – Kos

-1

Comment utilisez-vous cette requête? Si vous l'utilisez (par exemple) un comme script PHP, et écrit ceci:

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

l'interpréteur PHP sera effectivement décapage sur les barres obliques inverses, la production de la requête réelle

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

ce qui serait simplement n'importe quel enregistrement qui a au moins deux caractères. Pour que cela fonctionne correctement, vous devrez double évasion:

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

PHP dépouiller un des antislashs de chaque jeu, en laissant la seconde pour atteindre effectivement mysql.

+0

C'est l'analyseur MySQL lui-même qui supprime ces barres obliques, pas PHP. Essayez 'echo '\ (asdf \)';' en php - les barres sont toujours là – Kos

Questions connexes