Мне нужно выполнить поиск в базе данных. Я использую оператор LIKE, но проблема, которую я обнаружил, заключается в том, что он чувствителен к регистру и ударению, поэтому он не находит результатов.
Пример:
insert into post VALUES('¿Qué visitar cerca del Hotel Aquamarina Beach Cancún?','Cancún es uno de los destinos más visitados en México por sus playas hermosas, ya sea para disfrutar en familia, con la pareja o para disfrutar de la buena fiesta con amigos','tugfa.PNG')
И это мой запрос:
SELECT * FROM post where titulo like '%hotel aquamarina cancun beach%' or descripción like '%hotel aquamarina cancun beach%';
И это не дает мне никаких результатов.
Любое решение?
Укажите в своем
SELECT
ООНCOLLATION
, что он нечувствителен к акцентам:Я оставляю вам эту ссылку от Microsoft о них
COLLATION
(на английском языке) и этот другой пример для акцентов (на испанском языке) . Кроме того, мне кажется странным, что вы отличаете прописные буквы от строчных, так как по умолчанию это нечувствительно. Попробуйте выполнить следующий запрос, чтобы увидеть настройки для вашей таблицы:ОБНОВИТЬ:
Запрос, который вы ищете и который я дополнил в комментариях, таков:
Я понимаю из того, что вы говорите, что у вас есть поле в таблице с определенным COLLATE, что делает его чувствительным к регистру и акценту. Очевидно, что в этих случаях LIKE ведет себя одинаково,
Arriba
отличается от ,arriba
иsolución
отличается отsolucion
. В этих случаях, если нет альтернативы изменению COLLATE поля или SELECT, как предлагает @Kroneaux Schneider, единственным решением является улучшение LIKE для решения проблемы.Для проблемы верхнего/нижнего регистра мы можем сделать что-то вроде этого:
Для проблемы с акцентами решение немного сложнее, но не невозможно.
Вы также можете использовать несколько
REPLACE
, чтобы изменить строку LIKE и изменить каждую гласную на соответствующую ударную версию.Если вы используете PostgreSQL, вы можете использовать модуль unaccent и нижнюю функцию , вы можете сделать следующее:
Если вы используете MySQL, вы должны использовать сопоставление , где _CI указывает нечувствительный к регистру и _AC нечувствительный к акценту
Я предлагаю более простое решение: просто примените функцию UPPER(field) в WHERE, а затем в LIKE напишите термин прописными буквами.
Ваше здоровье!