mysql-запрос с регулярным выражением unicode

Я хотел бы сделать запрос mysql для catch: أرأء

этот символ может быть напечатан следующим образом: ( أ или إ или ا или آ )

поэтому, когда тип:

 $SQL=" select * from work where title REGEX '[\\u0622|\\u0623|\\u0625|\\u0627][\\u0631][\\u0622|\\u0623|\\u0625|\\u0627][\\u0621]" 

это не работает, я думаю, что синтаксис не очень хорош

У MySQL нет \ u экранов. Попробуйте включить в строку запроса необработанный символ Юникода и передать его MySQL в соединение utf8. Как вы можете это сделать, зависит от того, какой язык и коннектор вы используете для общения с MySQL. Лучше всего было бы передать строку шаблона в параметре из собственного строкового типа Unicode вашего языка, если он у вас есть; например, в Python-MySQLdb, я могу просто сделать:

 group= u'[أإاآ]' pattern= u'%sر%sء' % (chars, chars) connection.execute('SELECT * FROM work WHERE title REGEX %s', [pattern]) 

(nb не требуется символов в группе символов регулярных выражений)

Если вы действительно не можете полностью отключить Unicode от своего соединения, у MySQL есть нестандартная двоичная строка, которую вы можете использовать для получения символов через другую кодировку:

 WHERE title REGEX 0x5bd8a3d8a5d8a7d8a25dd8b15bd8a3d8a5d8a7d8a25dd8a1 AS utf8 - hex-encoded UTF-8 encoded string 

Как правило, вы хотите избежать использования REGEX потому что это означает, что любой индекс в столбце title будет неэффективным, и полный поиск таблицы будет принудительным.

Одним из вариантов было бы сделать WHERE title IN в списке из всех возможных строк, которые соответствовали бы выражению.

(Самый эффективный подход состоял бы в том, чтобы использовать сортировку базы данных, которая уже рассматривает все четыре символа как равные. Я не знаю о сортировке, которая не соответствует этому.

Utf8 для этих 4 вариантов алефа – D8A3 D8A5 D8A7 D8A2. Так,

 WHERE HEX(title) REGEXP '^(..)*D8(A3|A5|A7|A2)' 

будет проверять наличие какого-либо из них.

^(..)* соответствует любому числу пар символов (шестнадцатеричный, в данном случае) в начале title , а затем искать любой из этих двухбайтовых кодов utf8.

Это может быть то, к чему вы стремитесь:

 $SQL=" select * from work where HEX(title) REGEX '^(..)*D8(A2|A3|A5|A7)D8B1D8(A2|A3|A5|A7)D8A1'; 

^(..)* – пропустить четное число шестнадцатеричных символов (чтобы сохранить выравнивание).
D8(A2|A3|A5|A7) является кодировкой utf8 для 4 алефов.
D8B1 для Reh.