Я хотел бы сделать запрос 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.