Как с учетом регистра в MySQL - PullRequest
31 голосов
/ 10 ноября 2011

У меня есть запрос MySQL:

SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';

И моя таблица закодирована в utf8_general_ci с помощью MyISAM.

Поиск выполняется с учетом регистра.

Я не могу понять, как это исправить. Что не так и / или как мне это исправить?

Ответы [ 8 ]

41 голосов
/ 05 июня 2012

Гораздо лучшее решение с точки зрения производительности:

SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';

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

Другой альтернативой является использование COLLATE,

SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;
18 голосов
/ 10 ноября 2011

Попробуйте:

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%')
5 голосов
/ 08 сентября 2013

В этом методе нет необходимости выбирать искомое поле:

SELECT table.id 
FROM table
WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
0 голосов
/ 05 декабря 2017

Только для завершения, если это поможет:

Как указано в 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%';
0 голосов
/ 21 января 2017

Эта проблема возникает в этом случае из-за сортировки, используемой в таблице.Вы использовали utf8_general_ci в качестве сопоставления.Если сортировка изменена на utf8_general_ci, то при поиске не будет учитываться регистр.Итак, одно из возможных решений - изменить параметры сортировки.

0 голосов
/ 03 августа 2015

Проверьте 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 = 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)
0 голосов
/ 04 января 2013

Это работает также:

SELECT LOWER(DisplayName) as DN
FROM   Bidders
WHERE  OrgID=45
HAVING DN like "cbbautos%"
LIMIT  10;
0 голосов
/ 28 декабря 2012

Это рабочий код:

SELECT title,description
FROM (
 SELECT title,description, LOWER(CONCAT_WS(title,description)) AS concatenated
 FROM table1 
) AS Q
WHERE concatenated LIKE LOWER('%search%') 
...