programing

MySQL의 대소문자 구분처럼

instargram 2023. 10. 24. 20:09
반응형

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

반응형