Mam w bazie danych 'quizy' tabelę 'pytania', której to rekordy mają pole 'kategoria'. W pierwszym (w tym przykładzie to w jedynym) rekordzie tej tabelki pole 'kategoria' zawiera łańcuch znaków ".+aaa+.".
Chcę pobrać z bazy rekord, który ma w kategorii łańcuch zawierający sekwencję ".+a+." więc w zapytaniu SQL po REGEXP stosuję klucz '(\.\+a\+\.)'. Jeśli jedyny rekord w tabeli ma w polu 'kategoria' łańcuch ".+aaa+.", który nie zawiera łańcucha ".+a+." to nie powinno mi pobrać żadnego rekordu. Mimo to pobiera mi właśnie ten rekord.
Dla pewności porównałem ten sam klucz '(\.\+a\+\.)' z tym samym łańcuchem ".+aaa+." w funkcji preg_match() i w tym przypadku wszystko jest ok, czyli funkcja zwraca false bo ".+a+." nie pasuje do klucza '(\.\+a\+\.)'.
Więc moje pytanie jest następujące: czemu SQL i PHP ten sam łańcuch inaczej porównało z tym samym kluczem? może gdzieś mam błąd? oto kod:
  1. <?php
  2. $kropki="../";
  3. include_once($kropki.'system/pliki/funkcje.php');
  4.  
  5. $con=polaczZBaza("quizy");
  6.  
  7. if(preg_match('(\.\+a\+\.)', ".+aaa+."))echo 'tak<br/>';else echo 'nie<br/>';
  8.  
  9. $result = mysql_query("SELECT * FROM pytania WHERE kategoria REGEXP '(\.\+a\+\.)'");
  10. $row = mysql_fetch_array($result);
  11. echo $row['kategoria'];
  12.  
  13. ?>


jeśli po REGEXP damy klucz '(\.\+aa\+\.)' lub '(\.\+aaa\+\.)' to także pobiera ten rekord. Przy '(\.\+aaaa\+\.)' już tego nie robi. Wygląda to tak jak by ignorowało końcówkę "\.\+" i początek "\+\." klucza.

Edit: dałem klucz '(\\\.\\\+aaa\\\+\\\.)' i zdaje się, że działa, więc wychodzi na to, że po REGEXP trzeba podać klucz z dodatkowymi backslashami a w funkcji preg_match() nie.