Подобно Case Sensitive в MySQL
У меня есть запрос MySQL:
SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';
И моя таблица закодирована utf8_general_ci с MyISAM.
Поиски, похоже, чувствительны к регистру.
Я не могу понять, как это исправить. Что происходит неправильно и/или как его исправить?
Ответы
Ответ 1
Попробуйте следующее:
SELECT LOWER(CONCAT_WS(title,description)) AS concatenated
WHERE concatenated LIKE '%searchterm%'
или (чтобы увидеть разницу)
SELECT LOWER(CONCAT_WS(title,description)) AS concatenated
WHERE concatenated LIKE LOWER('%SearchTerm%')
Ответ 2
Лучшее решение с точки зрения производительности:
SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';
Сравнение строк зависит от регистра, если любой из операндов является двоичной строкой.
Другой альтернативой является использование COLLATE
,
SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;
Ответ 3
В этом методе вам не нужно выбирать искомое поле:
SELECT table.id
FROM table
WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
Ответ 4
Просто для завершения, если это помогает:
Как указано на https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html, для наборов символов по умолчанию нестандартные сравнения строк по умолчанию нечувствительны к регистру.
Таким образом, простой способ выполнить сравнение без учета регистра - это указать поле типа CHAR, VARCHAR или TEXT.
Вот пример с проверкой на одно поле:
SELECT * FROM table1 WHERE CAST(`field1` AS CHAR) LIKE '%needle%';
Ответ 5
Это также работает:
SELECT LOWER(DisplayName) as DN
FROM Bidders
WHERE OrgID=45
HAVING DN like "cbbautos%"
LIMIT 10;
Ответ 6
Проверьте CHARSET, упомянутый в схеме таблицы:
show create table xyz;
На основе CHARSET вы можете попробовать следующее.
select name from xyz where name like '%Man%' COLLATE latin1_bin;
select name from xyz where name like '%Man%' COLLATE utf8_bin;
Ниже приведены случаи, которые работали для меня, CHARSET = latin1, MySQL version = 5.6.
mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'Promo%' collate latin1_bin limit 1;
+-----------------------+
| installsrc |
+-----------------------+
| PromoBalance_SMS,null |
+-----------------------+
1 row in set (0.01 sec)
mysql>
mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' collate latin1_bin limit 1;
+---------------------------+
| installsrc |
+---------------------------+
| PROMO_SMS_MISSEDCALL,null |
+---------------------------+
1 row in set (0.00 sec)
mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' limit 1;
+-----------------------+
| installsrc |
+-----------------------+
| PromoBalance_SMS,null |
+-----------------------+
1 row in set (0.01 sec)
Ответ 7
Эта проблема возникает в этом случае из-за сопоставления, используемого в таблице. Вы использовали utf8_general_ci
как сортировку. Если сортировка изменена на utf8_general_ci
, тогда поиск не будет чувствителен к регистру.
Таким образом, одним из возможных решений является изменение сортировки.
Ответ 8
Это рабочий код:
SELECT title,description
FROM (
SELECT title,description, LOWER(CONCAT_WS(title,description)) AS concatenated
FROM table1
) AS Q
WHERE concatenated LIKE LOWER('%search%')