MariaDB to system oparty na mysql'u, jednak ich wyrażenia regularne oparte są na PCRE a w MySQL'u na POSIXIE . Więcej na:
https://mariadb.atlassian.net/browse/MDEV-7127.
Chciałbym utworzyć zapytanie korzystające z REGEXP, które będzie działało na tych dwóch systemach bazodanowych. Mam teraz z grubsza coś takiego:
SELECT * FROM firmy WHERE (firmy.nazwa RLIKE '(^|\\x{20})\\x{22}{1}amica\\x{22}{1}($|\\x{20})'
Jednak na MySQL dostaję błąd "SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'repetition-operator operand invalid' from regexp' ". Wcześniej w tym zapytaniu zamiast szesnastkowych reprezentacji
znaków (\\x{20} oznacza np. spację; więcej tutaj) używałem character setów czyli, np.
RLIKE '(^|[[.space.]]) ...
ale to z kolei powodowało na MariaDB błąd "POSIX collating elements are not supported". Jak z pierwszego zapytania usunę operatory powtórzeń, czyli w tym przypadku jeden {1} to nie ma błędu.
Ktoś ma jakiś pomysł jak używać takich wyrażeń żeby działało na MySQL oraz MariaDB?
Dodam że potrzebuję obsługi następujących znaków:
// na potrzeby działania w MariaDB ',' => "\\\x{2C}", ' ' => "\\\x{20}", '(' => "\\\x{28}", ')' => "\\\x{29}", '[' => "\\\x{5B}", ']' => "\\\x{5D}", '^' => "\\\x{5E}", '$' => "\\\x{24}", '\\' => "\\\x{5C}", '/' => "\\\x{2F}", '<' => "\\\x{3C}", '>' => "\\\x{3E}", '"' => "\\\x{22}", ':' => "\\\x{3A}" );
//wcześniej gdy system działał tylko na MySQL były tak jak pisałem character sety: ',' => "[[.comma.]]", ' ' => "[[.space.]]", '(' => "[[.left-parenthesis.]]", ')' => "[[.right-parenthesis.]]", '[' => "[[.left-square-bracket.]]", ']' => "[[.right-square-bracket.]]", '^' => "[[.circumflex-accent.]]", '$' => "[[.dollar-sign.]]", '\\' => "[[.backslash.]]", '/' => "[[.slash.]]", '<' => "[[.less-than-sign.]]", '>' => "[[.greater-than-sign.]]", '"' => "[[.quotation-mark.]]", ':' => "[[.colon.]]" );