Mysql класс символов не работает для арабского текста столбца

0

Определить класс символов mySQL [...] соответствует любому символу в скобках. Поэтому я использовал его для арабских персонажей. И это дает мне пустой набор каждый раз. Вот мой запрос:

select hadith_raw_ar from view_hadith_in_book where hadith_raw_ar like '%[بل]ت';

Я бы очень признателен за любую помощь, если когда-либо. Спасибо большое!

  • 0
    данные в БД правильно сохранены с правильной кодировкой? С помощью этого запроса вы можете проверить, является ли это utf8 SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "schemaname";
  • 0
    да, это имя набора символов utf8
Теги:
mysqli
wildcard

3 ответа

0
Лучший ответ

Определить класс символов mySQL [...] соответствует любому символу в скобках.

Умм, это неточно. Класс символов на самом деле является частью Regex, а не MySQL. Однако вы все равно можете использовать Regex с MySQL, но вам нужно использовать ключевое слово REGEXP вместо LIKE.

Теперь, если вы пытаетесь сопоставить все, что начинается с любого символа, представленного в вашем классе символов, вы должны использовать шаблон регулярного выражения, который выглядит примерно как ^[...] где вы заменяете ... символами, которые вы хотите,

Итак, в вашем случае вам нужно что-то вроде этого:

SELECT hadith_raw_ar FROM view_hadith_in_book WHERE hadith_raw_ar REGEXP '^[تبل]';

Это эквивалентно:

SELECT  hadith_raw_ar 
FROM    view_hadith_in_book 
WHERE   hadith_raw_ar LIKE 'ت%' OR 
        hadith_raw_ar LIKE 'ب%' OR
        hadith_raw_ar LIKE 'ل%';

..когда не используется Regex.


Рекомендации:

  • 1
    В зависимости от версии , которую вы используете, этот ответ не является правильным о REGEXP . (См. Мой ответ.) Эквивалент LIKE & OR должен работать. ( LIKE был реализован не так, как REGEXP .)
1

В более старых версиях нельзя использовать классы символов с наборами символов LIKE или RLIKE и не-latin1. (По крайней мере, не ожидайте и получите правильные результаты.)

REGEXP хромает. Он выглядит только в байтах; 6 байтов в вашем классе символов, некоторые из которых дублируются. Здесь hex: D8 AA D8 A8 D9 84.

Иногда вы получите правильный ответ от REGEXP. У MariaDB есть достойный REGEXP. Например, SELECT '٪' REGEXP '[تبل]'; возвращает true. Обратите внимание, что я тестирую знак арабского процента - hex D9AA. Обратите внимание, как я выбрал D9, который существует у некоторых арабских символов и AA.

В руководстве MySQL 8.0 подразумевается, что REGEXP может работать правильно на арабском языке. (Но не для Emoji и некоторых китайских иероглифов.) MariaDB имеет встроенный PCRE с 10.0.5.

  • 0
    Я использую MySQL Ver 14.14
  • 1
    Там нет 14.14. SELECT @@version; или mysqld --version
Показать ещё 3 комментария
0

Используйте коллекцию utf8_general_ci для вставки любых символов языка

  • 0
    Сортировка может иметь какое-то отношение к предполагаемому тесту, но не имеет ничего общего с классами символов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню