Снятие MySQL запросов с иностранных акцентов

Я должен признать, что я не знаю php, и что мой текущий скрипт был унаследован …

Он запрашивает базу данных MySQL с city имя и возвращает все найденные экземпляры этого city,

У меня была пара проблем: первая была связана с дефисами (например, Стратфорд-на-Эйвоне); это было решено с добавлением

$searchq = str_replace( '-', ' ', $searchq );

что позволяет мне вводить данные в базу данных без дефисов.

Моя остающаяся проблема связана с иностранным акцентом (в частности: острый, серьезный, круговой сплеток, седиль, тильда). Я перепробовал миллион функций, многие из которых я нашел на этом сайте, но мне не удалось заставить его работать.

основной код php моей текущей страницы это

$searchq = filter_var("%{$_POST['keyword']}%", FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); // Sanitize the string

$ searchq = str_replace (‘-‘, », $ searchq);

$sql = "SELECT Image, Chain, Country, City, Top as '', Medium as '', Low as '' FROM Chains WHERE Country LIKE ? OR City LIKE ?"; // Your query string

$prepare = $mysqli->prepare($sql); // Prepare your query string
$prepare->bind_param('ss', $searchq, $searchq); // Bind the placeholders to your search variables
// s = string | i = integer | d = double | b = blob
$prepare->execute(); // Execute the prepared statement
$prepare->store_result(); // Store the results for later checking

Я избегал посещать этот форум, так как понимаю, что он предназначен для продвинутых разработчиков, и я не один из них …

Весь приведенный выше код — УДАЛИТЬ букву с акцентом, а не заменять ее той же буквой без акцента.

РЕДАКТИРОВАТЬ

Как мне снова привлечь внимание Олли Джонса?

Я застрял, не зная, как обрабатывать часть сценария

Другой РЕДАКТИРОВАТЬ
Когда я ввожу это в таблицу SQL

Цепочки ALTER TABLE ПРЕОБРАЗОВАТЬСЯ В НАБОР СИМВОЛОВ utf8mb4 COLLATE utf8_general_ci;

Я получаю это предупреждение, и ничего не делается …

# 1253 — COLLATION ‘utf8_general_ci’ недопустим для набора символов CHARACTER ‘utf8mb4’

4

Решение

Наборы символов MySQL и функции сортировки предназначены для правильной обработки подобных вещей без необходимости в дополнительных столбцах поиска.

Например, посмотрите на этот маленький запрос:

select _utf8'résumé' COLLATE utf8_general_ci = _utf8'resume'

или, используя более современный набор символов utf8mb4,

select _utf8mb4'résumé' COLLATE utf8mb4_general_ci = _utf8mb4'resume'

Оба эти запроса обнаруживают, что résumé а также resume равны. Это работает почти для каждого европейского акцентированного символа.

Эти запросы содержат две символьные строковые константы, явно созданные как строки Юникода. Затем он сравнивает их, используя без учета регистра сверка. В этом сопоставлении все прописные и строчные буквы e-острые и e-могила считаются одинаковыми.

Как вы получаете это для работы с вашей базой данных?

  1. убедитесь, что набор символов ваших столбцов названия места (City, Country) установлены в utf8или, что еще лучше, более надежный и современный utf8mb4,

  2. убедитесь, что по умолчанию для этих таблиц используется сопоставление без учета регистра для выбранного набора символов.

  3. Просто делайте ваши запросы. Вам не нужно ничего особенного. Например, WHERE City = 'Sèvres' а также WHERE City = 'sevres' даст одинаковые результаты. Это идеально подходит для пользователей, привыкших к поиску по типу Google.

Перед изменением таблицы сделайте резервную копию на случай, если вы что-то напортачили.

CREATE TABLE chains_backup SELECT * FROM chains

Затем используйте команду такого рода, чтобы изменить столбцы в вашей таблице.

  alter table chains
modify City  varchar(255)
character set utf8mb4
collate utf8mb4_general_ci

На месте varchar(255) вам нужно использовать фактический тип данных столбца. Вы не сказали нам, что это такое, так что я думаю.

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

Обратите внимание, что испанский язык ñ это странный случай. С общим сопоставлением ñ а также n равны. Но в испанской лексикографии ñ это другое письмо. Так что если вы хотите алфавитное обозначение испанских топонимов, вам нужно utf8_spanish_ci или же utf8mb4_spanish_ci сверка.

Хорошие новости для кода, показанного в вашем вопросе, таковы: вам это не нужно just_clean работать вообще, когда вы используете регистронезависимую сортировку.

Вы можете использовать WHERE City LIKE 'stratford%' скорее, чем WHERE City = 'stratford' искать — это позволит вашим запросам соответствовать первым нескольким символам поискового запроса. LIKE конструкция будет соответствовать Stratford-upon-Avon так же как Stratfordshire,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector