У меня есть следующая задача: Создать личный словарь для китайских иероглифов.Пользователи выбирают отдельные китайские иероглифы из списка.Затем программа просматривает список комбинаций символов и отфильтровывает все, что содержит символы, которых нет в списке пользователей из отдельных символов.Таким образом, если пользователь изучил 1 (一) и 10 (十), то должен отображаться 11 (十一), а не 12 (十二).
Следующая проблема состоит в том, что существует около 12 000 одиночных символови 100к комбинаций.Весь список может стать очень длинным.В настоящее время я сталкиваюсь со следующей проблемой: MySQL, кажется, не в состоянии сделать правильное соответствие REGEX с символами Unicode.PHP может однако.Когда я делаю запрос MySQL (см. Ниже), я получаю много ложных срабатываний.Я должен снова отфильтровать результаты с помощью PHP.Все это занимает много времени.Теперь у меня есть пример списка из 180 отдельных символов, которые сопоставляются в регулярном выражении SQL, как показано ниже.Результатом SQL являются более 30 000 комбинаций.Для этого SQL-вызов занимает около 6 секунд на компьютере, на котором я работаю.Когда я проверяю результаты с PHP позже, результат - только 1182 комбинации.Это много ложных срабатываний.Кроме того, проверка результатов занимает еще пару секунд.С каждым добавляемым в список символом время увеличивается примерно на полсекунды.Срочно нужен более эффективный метод.
Чтобы решить эту проблему, мне сначала нужно выяснить, почему MySQL имеет так много ложных срабатываний:
Если я делаю регулярные выражения с PHP, я использую /regex/u
, чтобы указать, что субъектэто Unicode, и это дает мне правильные результаты.
В MySQL, однако, я не знаю, как установить такой флаг.Все результаты регулярного выражения REGEXP возвращаются так же, как если бы я использовал PHP preg_match('/regex/', $subject)
вместо /regex/u
.
Я пытался изменить сопоставление результата для различных utf8_ *, но оно не изменилосьрезультат.Кроме того, добавление полнотекстового индекса к базе данных ничего не сделало.
Вот функция тестирования, которую я написал для освещения проблемы.если у вас есть какие-либо другие идеи для проверки там, чтобы углубиться в проблему, пожалуйста, сообщите мне.
<code>$db = mysql_connect('localhost', 'kanji', '************');
$link = mysql_select_db('kanji_data', $db);
mysql_query('SET character_set_results=utf8');
mysql_query('SET names=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_results=utf8');
mysql_query('SET collation_connection=utf8_general_ci');
mysql_set_charset('utf8');
echo '<pre>debug: encoding=' .mysql_client_encoding(). '
';$ string = '三 | 二 | 四 | 一 | 五';$ sql = "SELECT упрощенный, длина (упрощенный), searchindex ИЗ китайского ГДЕ strlen> 0 И упрощенный REGEXP '($ string) +';";$ sql_encoding = mb_detect_encoding ($ sql);echo '
debug: sql string encoding: ' . $sql_encoding . '
';echo '
debug: sql string: ' . $sql . '
';// echo $ sql;$ rst = mysql_query ($ sql);echo mysql_errno ($ db).":".mysql_error ($ дБ)."\ П";while ($ row = mysql_fetch_array ($ rst, MYSQL_NUM)) {$ len = mb_strlen ($ row [0]);$ result_encoding = mb_detect_encoding ($ row [0]);$ pattern = "/ ^ (三 | 二 | 四 | 一 | 五) + $ / u";preg_match ($ pattern, $ row [0], $ match);if (count ($ match) == 0) {echo "ERROR:";} echo 'string:'.$ row [0].'('. $ row [1]. 'long mysql,'. $ len. 'long php, кодировка:'. $ result_encoding. ')'. $ row [2]. "
\ n \ n \ n«;}
Результат функции можно увидеть на этом веб-сайте .
Если я делаю что-то не так, чтобы добиться требуемого результата, я такжес удовольствием займусь этим по-другому.