MySQL의 대소문자 구분처럼
MySQL 쿼리가 있습니다.
SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';
그리고 제 테이블은 MyISAM과 함께 utf8_general_ci로 인코딩되어 있습니다.
검색은 대소문자를 구분하는 것 같습니다.
어떻게 고쳐야 할지 모르겠어요.무엇이 잘못되고 있으며 또는 이를 어떻게 해결해야 합니까?
성능 측면에서 훨씬 더 나은 솔루션:
SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';
문자열 비교는 피연산자 중 하나가 이진 문자열일 때 대소문자를 구분합니다.
다른 대안은 다음을 사용하는 것입니다.COLLATE
,
SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;
시도해 보기:
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%')
이 방법에서는 검색된 필드를 선택할 필요가 없습니다.
SELECT table.id
FROM table
WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
테이블 스키마에 언급된 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)
단지 완성을 위해 다음과 같은 도움이 되는 경우:
기본 문자 집합의 경우 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%';
이 경우 표에 사용된 대조 때문에 이 문제가 발생하고 있습니다.사용해보셨습니다.utf8_general_ci
공동으로콜렉션이 다음으로 변경된 경우utf8_general_ci
그러면 대소문자를 구분하지 않습니다.따라서 한 가지 가능한 해결책은 조합을 변경하는 것입니다.
작동 코드는 다음과 같습니다.
SELECT title,description
FROM (
SELECT title,description, LOWER(CONCAT_WS(title,description)) AS concatenated
FROM table1
) AS Q
WHERE concatenated LIKE LOWER('%search%')
이 기능은 다음과 같습니다.
SELECT LOWER(DisplayName) as DN
FROM Bidders
WHERE OrgID=45
HAVING DN like "cbbautos%"
LIMIT 10;
언급URL : https://stackoverflow.com/questions/8083455/like-case-sensitive-in-mysql
'programing' 카테고리의 다른 글
SQL 다른 테이블을 기준으로 행 삭제 (0) | 2023.10.29 |
---|---|
MySQL에서 부여 보기 (0) | 2023.10.24 |
Mysql 데이터 유형 열거 열에 새 값 추가 (0) | 2023.10.24 |
동적양식명속성동적양식명속성동적양식명속성Angularjs Angularjs Angularjs (0) | 2023.10.24 |
AngularJS - 지시 크기에 바인딩 (0) | 2023.10.24 |